flask路由和视图

路由基本定义

指定路由地址:

  • 指定访问路径为 demo1,http://127.0.0.1:5000/demo1

    @app.route('/demo1')
    def index():
    	return 'demo1'
    

给路由传参:

  • 路由传参,http://127.0.0.1:5000/user/abc

    @app.route('/user/<user_id>')
    def user_info(user_id):     
    	return 'hello %s' % user_id
    

    路由传递的参数默认当做 string 处理,也可以指定参数的类型

  • 指定路由传递参数类型(int),http://127.0.0.1:5000/user/123

    @app.route('/user/\<int:user_id\>') 
    def user_info(user_id):   
    	return 'hello %d' % user_id
    

    尖括号中的内容是动态的,在此暂时可以理解为接受 int 类型的值,实际上 int 代表使用 IntegerConverter 去处理 url 传入的参数。

指定请求方式:

默认请求方式:GET OPTIONS(自带) HEAD(自带)

​	@app.route('/demo2', methods=['GET', 'POST']) 
	def demo2():    
		# 直接从请求中取到请求方式并返回  
		return request.method

视图常用逻辑

return返回JSON

给客户端返回JSON数据,直接使用jsonify生成一个JSON的响应

\# 返回JSON 类型数据
@app.route('/demo4')
def demo4():
	json_dict = {   
		"user_id": 10,  
		"user_name": "laowang"    
	}
	return jsonify(json_dict)

不推荐使用 json.dumps 转成 JSON 字符串直接返回,因为返回的数据要符合 HTTP 协议,如果是 JSON 需要指定 content-type:application/json

return重定向:

  • 1 redirect
@app.route('/demo5') 
def demo5():    
	return redirect('http://www.baidu.com')
  • 2 url_for
\#demo1路径必须存在
@app.route('/demo5') 
def demo5():     
	return redirect(url_for('demo1'))
  • 3 url_for带参数,(’视图函数‘,形参=值)
@app.route('/demo5') 
def demo5():    
# 使用 url_for 生成指定视图函数所对应的 url     
	return redirect(url_for('user_info', user_id=100))

自定义状态码:

可以实现自定义状态码:status code: 666

@app.route('/demo6') 
def demo6():    
	return '状态码为 666', 666

正则匹配路由:

正则匹配路由,限制用户访问的参数。

具体实现步骤为:

  1. 导入转换器基类:在 Flask 中,所有的路由的匹配规则都是使用转换器对象进行记录
  2. 自定义转换器:自定义类继承于转换器基类
  3. 添加转换器到默认的转换器字典中
  4. 使用自定义转换器实现自定义匹配规则

代码实现

  • 1 导入转换器基类
    from werkzeug.routing import BaseConverter
  • 2.1 自定义转换器
\# 自定义正则转换器 
class RegexConverter(BaseConverter):    
def __init__(self, url_map, *args):         
	super(RegexConverter, self).__init__(url_map)         
	# 将接受的第1个参数当作匹配规则进行保存         
	self.regex = args[0] 
  • 2.2 将自定义转换器添加到转换器字典中,并指定转换器使用时名字为: re
app = Flask(__name__)  
app.url_map.converters['re'] = RegexConverter 
  • 3 自定义匹配规则(当前此处定义的规则是:3位数字)
  @app.route('/user/\<re("[0-9]{3}"):user_id\>') 
  def user_info(user_id):     
  return "user_id 为 %s" % user_id 

运行测试:http://127.0.0.1:5000/user/123 ,如果访问的url不符合规则,会提示找不到页面

系统自带转换器

DEFAULT_CONVERTERS = {    
	 'default':          UnicodeConverter,     注意默认和字符串都是UnicodeConverter    
	 'string':           UnicodeConverter,    
	 'any':              AnyConverter,     
	'path':             PathConverter,     
	'int':              IntegerConverter,     
	'float':            FloatConverter,     
	'uuid':             UUIDConverter, } 

系统自带的转换器具体使用方式在每种转换器的注释代码中有写,请留意每种转换器初始化的参数。

PostMan测试工具:

PostMan 模拟网页 HTTP 请求的 Chrome 插件,可以对路由和视图函数进行调试,基本操作就是会使用它。

猜你喜欢

转载自blog.csdn.net/weixin_40302130/article/details/83827135