孩子在做数据库大作业,对于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