Flask---Configuration, Routing, View

This blog is to paste the demo, and then analyze the source code execution process in it

configure from_object

s1.py

from flask import Flask
app = Flask(__name__)
# 配置文件
app.config.from_object("settings.DevelopmentConfig")

@app.route('/index',methods=['GET','POST'])
def index():
    return "index"

if __name__ == '__main__':
    app.run()

settings.py

class BaseConfig(object):
    DEBUG = True
    SECRET_KEY = "asudflkjdfadjfakdf"

class ProductionConfig(BaseConfig):
    DEBUG = False

class DevelopmentConfig(BaseConfig):
    pass

class TestingConfig(BaseConfig):
    pass

routing

url configuration

from flask import Flask
app = Flask(__name__)


# 路由方式一(*):
@app.route('/index',methods=['GET','POST'])
def index():
    return "Indexx"

# 路由方式二:
def order():
    return 'Orderr'

app.add_url_rule('/order',view_func=order)

if __name__ == '__main__':
    app.run()

url reverse parsing

from flask import Flask,url_for
app = Flask(__name__)

@app.route('/index',methods=['GET','POST'],endpoint='n1')
def index():
    v1 = url_for('n1')
    #默认函数名
    v2 = url_for('login')
    v3 = url_for('logoutt')
    print(v1,v2,v3)
    return "Index"

@app.route('/login',methods=['GET','POST'])
def login():
    return "login"

@app.route('/logout',methods=['GET','POST'])
def logoutt():
    return "logout"

if __name__ == '__main__':
    app.run()

Browser input http://127.0.0.1:5000/index
console output/index /login /logout

secondary url

from flask import Flask,render_template,redirect,url_for
app = Flask(__name__)

@app.route('/index/<int:nid>',methods=['GET','POST'])
def index(nid):
    print(nid,type(nid))
    return "Index"

if __name__ == '__main__':
    app.run()

Browser input http://127.0.0.1:5000/index/1
console output1 <class 'int'>

custom URL

from flask import Flask,render_template,redirect,url_for
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
        print("regex",regex)

    def to_python(self, value):
        """
        路由匹配时,匹配成功后传递给视图函数中参数的值
        :param value:
        :return:
        """
        print("value", value)
        return int(value)

    def to_url(self, value):
        """
        使用url_for反向生成URL时,传递的参数经过该方法处理,返回的值用于生成URL中的参数
        :param value:
        :return:
        """
        val = super(RegexConverter, self).to_url(value)
        print("val", val)
        return val

app.url_map.converters['xxx'] = RegexConverter

@app.route('/index/<xxx("\d+"):nid>',methods=['GET','POST'])
def index(nid):
    print(nid,type(nid))
    v = url_for('index',nid=999) # /index/999
    print(v)
    return "Index"

if __name__ == '__main__':
    app.run()

Start the program output
regex \d+
browser input http://127.0.0.1:5000/index/1
console output

value 1
1 <class 'int'>
val 999
/index/999

redirect_to

from flask import Flask,render_template,redirect
app = Flask(__name__)

@app.route('/index',methods=['GET','POST'],redirect_to='/new')
def index():
    return "老功能"

@app.route('/new',methods=['GET','POST'])
def new():
    return '新功能'

if __name__ == '__main__':
    app.run()

When the browser enters index、newthe path, the page will be rendered新功能

subdomain subdomain

hosts file

127.0.0.1 www.safly.com
from flask import Flask,render_template,redirect
app = Flask(__name__)
app.config['SERVER_NAME'] = 'safly.com:5000'


@app.route("/dynamic", subdomain="<username>")
def xxxxxxx(username):
    print(username)
    return 'xxxxx'

if __name__ == '__main__':
    app.run()

Input browser http://www.safly.com:5000/dynamic
page output xxxxx
console outputwww

Use decorators on routes

from flask import Flask,render_template,redirect
app = Flask(__name__)
import functools

def wapper(func):
    @functools.wraps(func)
    def inner(*args,**kwargs):
        print('before')
        return func(*args,**kwargs)
    return inner



@app.route('/xxxx',methods=['GET','POST'])
@wapper
def index():
    return "Index"


@app.route('/order',methods=['GET','POST'])
@wapper
def order():
    return "order"

if __name__ == '__main__':
    app.run()

view

FBV method

from flask import Flask,render_template,redirect,views
app = Flask(__name__)
import functools

def wapper(func):
    @functools.wraps(func)
    def inner(*args,**kwargs):
        print('before')
        return func(*args,**kwargs)
    return inner

##########FBV模式#############
@app.route('/index',methods=['GET','POST'])
@wapper
def index():
    print("index")
    return "Index"


if __name__ == '__main__':
    app.run()

Browser input http://127.0.0.1:5000/index
console output

before
index

CBV method

from flask import Flask,render_template,redirect,views
app = Flask(__name__)
import functools

def wapper(func):
    @functools.wraps(func)
    def inner(*args,**kwargs):
        print('before')
        return func(*args,**kwargs)
    return inner


# #########CBV方式一############
class IndexView(views.View):
    methods = ['GET']
    decorators = [wapper, ]

    def dispatch_request(self):
        print('index1')
        return 'index1!'

app.add_url_rule('/index1', view_func=IndexView.as_view(name='index1'))  # name=endpoint


#########CBV方式二############
class IndexView(views.MethodView):
    methods = ['GET']
    decorators = [wapper, ]

    def dispatch_request(self):
        print('index2')
        return 'index2!'


    def get(self):
        print("index2.GET")
        return 'index2.GET'

    def post(self):
        return 'index2.POST'

app.add_url_rule('/index2', view_func=IndexView.as_view(name='index2'))  # name=endpoint


if __name__ == '__main__':
    app.run()

Browser input http://127.0.0.1:5000/index1
console

before
index1

http://127.0.0.1:5000/index2
console

before
index2

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324879368&siteId=291194637