路由和视图


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()

猜你喜欢

转载自blog.csdn.net/abc_soul/article/details/83509245
今日推荐