zoukankan      html  css  js  c++  java
  • 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"
    详细参数说明
  • 相关阅读:
    Android View 阴影的总结
    清晰的教你如何将 Maven 项目上传至 中央仓库以及版本更新
    简单粗暴的上传项目至 Github
    App自动更新(DownloadManager下载器)
    类型判断
    前端防御XSS
    window.location.href/replace/reload()/页面跳转+替换+刷新
    对数组排序进行"洗牌"(随机排序)
    iframe跨域上传图片
    Vim 新手节省时间的小技巧
  • 原文地址:https://www.cnblogs.com/sunxiuwen/p/9989952.html
Copyright © 2011-2022 走看看