Flask之路由系统
1、两种添加路由的方式
# 方式一 @app.route('/index', endpoint='index_html') # endpoint指定的是别名 def index(): return render_template('login.html') # 方式二 def index(): return render_template('login.html') app.add_url_rule('/index', 'index_html', index) # index_html是别名
2、添加路由关系的本质
将url和视图函数封装成一个Rule对象,添加到Flask的url_map字段中
3、动态参数路由
@app.route('/user/<username>') # 常用的,不加参数默认都是字符串形式的 @app.route('/put/<int:id>') # 常用的,指定int,说明是整型的 @app.route('/put/<float:id>') @app.route('/put/<path:path>') @app.route('/login', methods=['get', 'post'])
路由中有动态参数,都会以位置参数让视图接收!!!
常用路由系统有以上五种,所有的路由系统都是基于一下对应关系来处理:
DEFAULT_CONVERTERS = { 'default': UnicodeConverter, 'string': UnicodeConverter, 'any': AnyConverter, 'path': PathConverter, 'int': IntegerConverter, 'float': FloatConverter, 'uuid': UUIDConverter, }
4、反向生成url:url_for()
endpoint('name') # 别名,相当于django中的name,反向解析
from flask import Flask, url_for
@app.route('/index',endpoint="xxx") #endpoint是别名 def index(): v = url_for("xxx") ===> /index print(v) return "index" @app.route('/zzz/<int:nid>',endpoint="aaa") #endpoint是别名 def zzz(nid): v = url_for("aaa",nid=nid) print(v) return "index2"
5、@app.route和app.add_url_rule参数
methods: 指定当前url地址,允许访问的请求方式
endpoint: 反向url地址,即别名name,默认为视图函数名【同时也解决了用同一个装饰器装饰多个视图导致endpoint名一样出错的bug】
redirect_to: url地址永久重定向301,常用场景:网址变了,当打原地址,会自动跳转到新网址,不走视图
subdomain: 子域名前缀,即网址的的www.baidu.com中的www,一个域名可以有多个子域名前缀
设置subdomain=‘blog’
需要在app.config['SERVER_NAME'] = "addmoney.com"
那么就可以通过 blog.addmoney.com 访问了
defaults:视图函数的参数默认值如defaults = {"nid": 100}
from flask import url_for @app.route("/info", methods=["GET", "POST"], endpoint="r_info", defaults={"nid": 100}) def student_info(nid): print(url_for("r_info")) # /info # stu_id = int(request.args["id"]) print(nid) # 100 return f"Hello Old boy {nid}" # Python3.6的新特性 f"{变量名}"
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
@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:WindowsSystem32driversetc 找到HOST,修改配置 然后吧域名修改成自己的本地服务器127.0.0.1 加上配置:app.config["SERVER_NAME"] = "haiyan.com:5000"