1. 程式人生 > >基於hi-nginx的web開發(python篇)——cookie和會話管理

基於hi-nginx的web開發(python篇)——cookie和會話管理

class status domain 登陸 edi 模板引擎 log 怎麽辦 cache

hi-nginx通過redis管理會話。

要開啟管理,需要做三件事。

第一件開啟userid:

        userid                  on;
        userid_name             SESSIONID;
        userid_domain           localhost;
        userid_path             /;
        userid_expires          300s;

這個功能是nginx內建的,可以直接使用。需要註意的是,hi-nginx只認識SESSIONID的userid_name。

第二件是配置redis服務器:

        hi_redis_host 127.0.0.1;
        hi_redis_port 6379;

當然,你應該先安裝redis並確保它運行。

第三件是在location段開啟會話管理:

    location  /  {
            hi_need_session on;
            hi_session_expires 300s;
            hi_python_script python/index.py;
    }

整個nginx配置寫下來,就是:

 1 server {
 2     listen 8080;
3 server_name localhost; 4 5 userid on; 6 userid_name SESSIONID; 7 userid_domain localhost; 8 userid_path /; 9 userid_expires 300s; 10 11 hi_redis_host 127.0.0.1; 12 hi_redis_port 6379;
13 14 15 location / { 16 hi_need_cache off; 17 hi_cache_expires 5s; 18 19 hi_need_session on; 20 hi_session_expires 300s; 21 hi_python_script python/index.py; 22 } 23 }

需要註意是,應該確保hi_session_expires和userid_expires的值保持一致。

配置寫完後,記得reload或者restart nginx。

接下來就是使用會話管理的api了。

說來太簡單,都不好意思寫出來,用req.has_session,req.get_session和res.session即可:

@app.route(^/session/?$,[GET])
def session(req,res,param):
    k=test
    v=0
    if req.has_session(k):
        v=int(req.get_session(k))
        res.session(k,str(v+1))
    else:
        res.session(k,str(v))
    res.content({}={}.format(k,v))
    res.status(200)

那麽,cookie怎麽辦?人們使用cookie的一大用途建立會話機制。上文已經把會話管理的使用說清楚了。所以使用hi.py框架時不需要特別留意cookie的管理。當然,如果你想自己管理cookie,hi-nginx也提供req.has_cookie和req.get_cookie兩個只讀api。如果要寫api,可以使用res.header來寫。比如:

在location段中添加hi_need_cookies on

1     location / {
2         hi_need_cache off;
3         hi_cache_expires 5s;
4         hi_need_cookies on;
5         hi_need_session on;
6         hi_session_expires 300s;
7         hi_python_script python/index.py;
8     }

在操作函數中在添加相關操作:

@app.route(^/session/?$,[GET])
def session(req,res,param):
    k=test
    v=0
    if req.has_session(k):
        v=int(req.get_session(k))
        res.session(k,str(v+1))
    else:
        res.session(k,str(v))
    cv=v
    if req.has_cookie(k):
        cv=int(req.get_cookie(k))
        res.header(Set-Cookie,{}={};Path={};Domain={}.format(k,cv+1,/,localhost))
    else:
        res.header(Set-Cookie,{}={};Path={};Domain={}.format(k,cv,/,localhost))
    res.content(session:{0}={1},cookie:{0}={2}.format(k,v,cv))
    res.status(200)

如上所見,在hi.py中操控和管理cookie和會話是非常方便的,用來寫個登陸或者購物車什麽的,配合hi.py的jinja2模板引擎,簡直易如反掌。

基於hi-nginx的web開發(python篇)——cookie和會話管理