Genie.jl中session的设置和获取

孩子在做数据库大作业,对于Genie登陆的session设置产生了不小的疑问:

route("/api/login") do 
  uid = haskey(@params, :id) ? @params(:id) : ""
  password = haskey(@params, :password) ? @params(:password) : ""
  res = UsersController.checkLogin(uid, password, @params)
  println(@params[:SESSION])
  return res
end
  function checkLogin(uid, password, params)
    user = find(User, where("uid = ?", uid) + where("password = ?", password))
    ( (! haskey(params, Genie.PARAMS_SESSION_KEY) || params[Genie.PARAMS_SESSION_KEY] === nothing) ) &&
    (Sessions.start(params[:REQUEST], params[:RESPONSE], params))

    sess = params[:SESSION]
    if length(user) != 0
      return Dict("code" => 1, "msg" => "error!") |> json
    else
      Genie.Sessions.set!(sess, :uid, uid)
      # println(params[:SESSION], "\n\n\n", params)
      return Dict("code" => 0, "msg" => "success!") |> json
    end
  end

上面分别是登陆的接口和处理函数,Genie.Sessions.set!(sess, :uid, uid)是session的设置,在route中println(@params[:SESSION])也是成功的。

然而再次发送请求时,例如用户做一些其他查询时,我无法获取@params:SESSION值,报错为没有该键。

所以我想知道设置和获取session的正确姿势是什么。

另外我发现Genie.Sessions.session函数是有bug的,因为如果一个字典没有:SESSION键,这个函数会返回一个HTTP.Request,与其函数规定的返回值相违背,而且没有相应的convert函数,调用session(params)会直接出现错误。

function start(req::HTTP.Request, res::HTTP.Response, params::Dict{Symbol,Any} = Dict{Symbol,Any}(); options::Dict{String,String} = Dict{String,String}()) :: Tuple{HTTP.Request,HTTP.Response,Dict{Symbol,Any}}

function session(params::Dict{Symbol,Any}) :: Sessions.Session
  ( (! haskey(params, Genie.PARAMS_SESSION_KEY) || params[Genie.PARAMS_SESSION_KEY] === nothing) ) &&
      (params[Genie.PARAMS_SESSION_KEY] = Sessions.start(params[Genie.PARAMS_REQUEST_KEY], params[Genie.PARAMS_RESPONSE_KEY])[1])

  params[Genie.PARAMS_SESSION_KEY]
end

另外我知道在Django框架里,我可以用request.session['uid'] = 'someid'来设置和获取session,不知道Genie里正确的姿势是什么……

问题解决了,需要先用Sessions.init()
社区连接