1. 程式人生 > >路由和檢視

路由和檢視


title: 路由和檢視
date: 2018-10-29 11:06:17
tags: flask
categories: 十月,2018

什麼是wsgi?

web服務閘道器介面,wsgi是一個協議,實現該協議的模組:
	- wsgiref
	- werkzeug
實現其協議的模組本質上就是socket服務端用於接收使用者請求,並處理
一般web框架基於wsgi實現,這樣實現關注點分離。

wsgiref示例:
	from wsgiref.simple_server import make_server
		
		def run_server(environ, start_response):
			start_response('200 OK', [('Content-Type', 'text/html')])
			return [bytes('<h1>Hello, web!</h1>', encoding='utf-8'), ] 
		
		if __name__ == '__main__':
			httpd = make_server('127.0.0.1', 8000, run_server)
			httpd.serve_forever()
wsgizeug示例:
	from werkzeug.wrappers import Response
	from werkzeug.serving import run_simple
	
	def run_server(environ, start_response):
		response = Respoense('hello')
		return response(environ, start_response)
	
	if __name__ == '__main__':
		run_simple('127.0.0.1', 8000, run_server)
	
Flask原始碼入口:
	from werkzeug.wrappers import Response
	from werkzeug.serving import run_simple
	
	class Flask(object):
		
		def __call__(self,environ, start_response):
			response = Response('hello')
			return response(environ, start_response)
		
		def run(self):
			run_simple('127.0.0.1', 8000, self)
	
	app = Flask()

	if __name__ == '__main__':
		app.run()

Flask 提供功能

- 配置檔案
	- 所有配置都在app.config中
	- app.config["xx"] = 123
	- app.config.from_object("類的路徑")
	- 應用:importlib、getattr
		- django中介軟體
		- rest framework全域性變數
	- session
		- 加密後放置在使用者瀏覽器的cookie中
		- 流程:
			- 請求到來
			- 檢視函式
			- 請求結束
		- 配置檔案
	- 閃現
		- 基於session實現
	- 路由
		- 裝飾器(帶引數)
		- 自定義裝飾器放下面
		- 引數
		- url_for
	- 檢視
		- FBV
	- 請求和響應
		- 請求:request
		- 響應:4種(字串、Response物件、重定向型別redirect()、錯誤碼處理abort(404))
	- 模板
		- ......
	- 特殊裝飾器
		- before_first_request
		- before_request
		- after_request
		- template_global()
		- template_filter()
		- errorhandler(404)
	- 中介軟體

路由和檢視

- 路由 + 檢視
	- 路由設定的兩種方式:
		- @app.route('/xxx')
				def index():
					return "index"
		- def index():
			  return "index"
		  app.add_url_rule("/xxx",None,index)
		- 注意事項:
			- 不能讓endpoint重名
			- 如果重名函式也要重名
	- 引數
		- rule,                       URL規則
		- view_func,                  檢視函式名稱
		- endpoint=None,              名稱,用於反向生成URL,即: url_for('名稱')
		- methods=None,               允許的請求方式,如:["GET","POST"]
		- strict_slashes=None,        對URL最後的 / 符號是否嚴格要求,
		- redirect_to=None,           重定向到指定地址
		- defaults=None,              預設值,當URL中無引數,函式需要引數時,使用defaults={'k':'v'}為函式提供引數
		- subdomain=None,             子域名訪問
	- CBV
		import functools
		from flask import Flask, views
		
		app = Flask(__name__)
			
			def wrapper(func):
				
				@functools.wraps(func)
				def inner(*args, **kwargs):
					return func(*args **kwargs)
				
				return inner
		
		class UserView(views.MethodView):
			methods = ['GET']
			decorators = [wrapper,]
			
			def get(self, *args, **kwargs):
				return 'GET'
			def post(self, *args, **kwargs):
				return 'POST'
			
			app.add_url_rule('/user', None, UserView.as_view('uuuu'))
			
			if __name == '__main__':
				app.run()
	
	- 自定義正則:
		from flask import Flask,url_for

		app = Flask(__name__)

		# 步驟一:定製類
		from werkzeug.routing import BaseConverter
		class RegexConverter(BaseConverter):
			"""
			自定義URL匹配正則表示式
			"""

			def __init__(self, map, regex):
				super(RegexConverter, self).__init__(map)
				self.regex = regex

			def to_python(self, value):
				"""
				路由匹配時,匹配成功後傳遞給檢視函式中引數的值
				:param value:
				:return:
				"""
				return int(value)

			def to_url(self, value):
				"""
				使用url_for反向生成URL時,傳遞的引數經過該方法處理,返回的值用於生成URL中的引數
				:param value:
				:return:
				"""
				val = super(RegexConverter, self).to_url(value)
				return val

		# 步驟二:新增到轉換器
		app.url_map.converters['reg'] = RegexConverter

		"""
		1. 使用者傳送請求
		2. flask內部進行正則匹配
		3. 呼叫to_python(正則匹配的結果)方法
		4. to_python方法的返回值會交給檢視函式的引數

		"""

		# 步驟三:使用自定義正則
		@app.route('/index/<reg("\d+"):nid>')
		def index(nid):
			print(nid,type(nid))

			print(url_for('index',nid=987))
			return "index"

		if __name__ == '__main__':
			app.run()