Flask框架-路由系统

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"{变量名}"
@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"
详细参数说明
原文地址:https://www.cnblogs.com/sunxiuwen/p/9989952.html