欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

路由和视图

程序员文章站 2022-06-17 10:47:10
...

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()
相关标签: flask