hi.py 的提供的路由裝飾器接受兩個參數,第一個參數指定動態路由的正則模式,第二個參數指定同意的http請求方法列表。 比如: 這個路由指定uri為/client或者/client/,同時請求方法為GET或者POST的http請求由函數client(req,res,param)來處理。uri模式由 ...
hi.py 的提供的路由裝飾器接受兩個參數,第一個參數指定動態路由的正則模式,第二個參數指定同意的http請求方法列表。
比如:
1 @app.route(r"^/client/?$",['GET','POST']) 2 def client(req,res,param): 3 res.content('{}<br>{}<br>{}<br>{}<br>{}'.format(req.client(),req.method(),req.uri(),req.user_agent(),req.param())) 4 res.status(200)
這個路由指定uri為/client或者/client/,同時請求方法為GET或者POST的http請求由函數client(req,res,param)來處理。uri模式由正則表達式構成,請求方法參數由一個list表示,可接受的方法名包括:GET,POST,PUT,HEAD,PATCH等,凡nginx能理解的http方法名均可。
處理函數有三個參數,分別是req,res和param。它們分別是hi_req,hi_res和由正則表達式引出的group dict。前兩者是有hi-nginx提供的api,它們提供一系列方法來操控http協議:
hi_req
- uri
- method
- client
- param
- user_agent
- has_header
- get_header
- has_form
- get_form
- has_session
- get_session
- has_cookie
- get_cookie
hi_res
- status
- content
- header
- session
處理函數的第三個參數param可用來解析由正則模式提供的數據,比如:
1 @app.route(r"^/hello/(?P<who>\w+)?$",['GET']) 2 def hello(req,res,param): 3 res.content('{}={}'.format('who',param['who'])) 4 res.status(200)
正則模式 ^/hello/(?P<who>\w+)?$ 是python re模塊可以理解的模式,當uri為/hello/cnblogs時,其中的參數param就會是一個包含以who為鍵,以cnblogs為其值的dict字典。因此,它可以用來為操作函數提供表單以外的數據,還能美化uri。比如/hello?who=cnblogs就不如/hello/cnblogs美觀簡潔。
另外,同一個操作函數也可以對應多個路由規則,比如:
1 @app.route(r'^/test/?$',['POST']) 2 @app.route(r"^/$",['GET']) 3 def hello_world(req,res,param): 4 res.header('Content-Type','text/plain;charset=utf-8') 5 res.content('hello,world') 6 res.status(200)
在上面的代碼中,操作函數hello_world在uri為/或者/test或者/test/時均能被調用,前提是一個要求請求方法是GET,另一個則要求是POST方法。這種一個函數對應多個路由的功能消除了寫下麵這種代碼的麻煩:
1 if req.method()=='GET': 2 ... 3 if req.method()=='POST': 4 ...