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"
 

 

 

 

 

posted @ 2018-04-30 23:40  兰博~~  阅读(223)  评论(0编辑  收藏  举报