flask之路由
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中起别名
反向生成URL: url_for
endpoint("name") #别名,相当于django中的name
反向解析需要导入:
from flask import Flask, url_for
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()
@1.可传入参数
@app.route('/user/<username>') #常用的 不加参数的时候默认是字符串形式的 @app.route('/post/<int:post_id>') #常用的 #指定int,说明是整型的 @app.route('/post/<float:post_id>') @app.route('/post/<path:path>') @app.route('/login', methods=['GET', 'POST'])
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()
6.@app.route和app.add_url_rule参数
@app.route和app.add_url_rule参数: rule, URL规则 view_func, 视图函数名称 defaults=None, 默认值,当URL中无参数,函数需要参数时,使用defaults={'k':'v'}为函数提供参数 endpoint=None, 名称,用于反向生成URL,即: url_for('名称') methods=None, 允许的请求方式,如:["GET","POST"] strict_slashes=None, 对URL最后的 / 符号是否严格要求, 如: @app.route('/index',strict_slashes=False), 访问 http://www.xx.com/index/ 或 http://www.xx.com/index均可 @app.route('/index',strict_slashes=True) 仅访问 http://www.xx.com/index redirect_to=None, 重定向到指定地址 如: @app.route('/index/<int:nid>', redirect_to='/home/<nid>') 或 def func(adapter, nid): return "/home/888" @app.route('/index/<int:nid>', redirect_to=func) subdomain=None, 子域名访问 from flask import Flask, views, url_for app = Flask(import_name=__name__) app.config['SERVER_NAME'] = 'haiyan.com:5000' @app.route("/", subdomain="admin") def static_index(): """Flask supports static subdomains This is available at static.your-domain.tld""" return "admin.xxx.com" #动态生成 @app.route("/dynamic", subdomain="<username>") def username_index(username): """Dynamic subdomains are also supported Try going to user1.your-domain.tld/dynamic""" return username + ".your-domain.tld" if __name__ == '__main__': app.run() 所有的域名都得与IP做一个域名解析: 如果你想通过域名去访问,有两种解决方式: 方式一: 1、租一个域名 haiyan.lalala 2、租一个公网IP 49.8.5.62 3、域名解析: haiyan.com 49.8.5.62 4、吧代码放在49.8.5.62这个服务器上,程序运行起来 用户可以通过IP进行访问 方式二:如果是自己测试用的就可以用这种方式。先在自己本地的文件中找 C:\Windows\System32\drivers\etc 找到HOST,修改配置 然后吧域名修改成自己的本地服务器127.0.0.1 加上配置:app.config["SERVER_NAME"] = "haiyan.com:5000"