zoukankan      html  css  js  c++  java
  • 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:WindowsSystem32driversetc  找到HOST,修改配置
                然后吧域名修改成自己的本地服务器127.0.0.1
                加上配置:app.config["SERVER_NAME"] = "haiyan.com:5000"
     
     
  • 相关阅读:
    activemq学习
    shell变量
    ext3文件系统目录限制问题
    linux性能优化cpu 磁盘IO MEM
    vs2010下编译osip2和eXosip2的4.0.0版的静态库及搭建开发环境
    samba的rpm包,只有tar.gz文件安装
    随记
    mount/umount系统调用
    不定参数的传递VA_LIST的用法
    samba服务器源码安装(非rpm)
  • 原文地址:https://www.cnblogs.com/1996-11-01-614lb/p/8975262.html
Copyright © 2011-2022 走看看