flask 依赖 wsgi, 实现 wsgi 的模块: wsgiref,werkzeug,uwsgi
实例化 Flask 的对象, 里面有参数
app = Flask(__name__,template_folder='templates',static_url_path='/xxxxxx')
1. 添加路由的两种方式
程序第一次启动起来, 是将 url 和视图一一对应起来
服务器启动, 是将 url 和视图的关系找出来
在 flask 中添加路由有两种方式, 根据装饰器的源码发现的, 一般我们用第一种
路由方式一:
- @app.route('/index',methods=['GET','POST'])
- def index():
- return "Index"
路由方式二:
- def order():
- return 'Order'
- app.add_url_rule('/order',view_func=order)
2. 有关 endpoint, 相当于 Django 中起别名
- from flask import Flask,render_template,redirect,url_for
- app = Flask(__name__) #实例化一个对象
- '''
执行流程
1. 执行 decorator=@app.route('/index',methods=['GET','POST'])
2.@decorator
新 index = decorator(index)
本质是执行了 add_url_rule
- self.add_url_rule(rule, endpoint, f, **options)
- '''
- # 所以创建路由就有两种方式
- # endpoint='n1' 相当于我们 django 中的路由中起的别名,
- @app.route('/index',methods=['GET','POST'],endpoint='n1') #调用 route 方法, 返回一个值
- # 这里可以看 route 的源码, route 返回一个函数
- def index():
- v1=url_for('n1')
- v2=url_for('n2')
- v3=url_for('n3')
- print(v1,v2,v3)
- return "index"
- @app.route('/login',methods=['GET','POST'],endpoint='n2')
- def login():
- return "login"
- @app.route('/logout',methods=['GET','POST'],endpoint='n3')
- def logout():
- return "logout"
- # 这是第二种添加路由的方式, 一般我们用第一种
- def order():
- return 'Order'
- app.add_url_rule('/order',view_func=order)
- if __name__ == '__main__':
- app.run()
3. 有关转换器
- from flask import Flask
- from werkzeug.routing import BaseConverter
- app = Flask(__name__)
- 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['xxx'] = RegexConverter
- @app.route('/index/<xxx("\d+"):nid>',methods=['GET','POST'])
- def index(nid): #这个参数的意思是 index 后面支持填写一个数字, 这个数字会自动填写给 nid 这个参数
- print(nid,type(nid))
- return "index"
- if __name__ == '__main__':
- app.run()
4. 由老功能的路径直接调到新功能 (redirect_to = '/index')
- from flask import Flask
- app = Flask(__name__)
- @app.route('/index',methods=['GET','POST'],redirect_to='/index')
- def index():
- return "老功能"
- @app.route('/new',methods=['GET','POST'])
- def new():
- return "新功能"
- if __name__ == '__main__':
- app.run()
5. 装饰器作业
- from flask import Flask,render_template,redirect
- import functools
- app = Flask(__name__)
- def wapper(func):
- @functools.wraps(func)
- def inner(*args,**kwargs):
- print('before')
- return func(*args,**kwargs)
- return inner
- @app.route('/xxx',methods=['GET','POST'])
- @wapper
- def index():
- return "index"
- @app.route('/order',methods=['GET','POST'])
- @wapper
- def order():
- return "order"
- if __name__ == '__main__':
- app.run()
来源: http://www.bubuko.com/infodetail-2582112.html