day110--Flask--路由配置, flask实例化配置, app对象配置, 特殊装饰器, Blueprint

1.路由配置:app.add_url_rule("路由地址",view_func=视图函数,endpoint="反向地址")
methods 允许进入当前视图函数的请求方式
endpoint 反向生成URL地址 默认是视图函数名 -解决视图函数重名     endpoint是唯一值,不能重复
url_for 根据函数名反向生成URL地址, 如果加了装饰器,应把函数名改为endpoint名,见代码
defaults 传递默认参数 defaults={"nid":1} def index(nid)
strict_slashes 是否严格遵守URL地址规则 == True 在地址末尾不可以出现 / 反之可以
redirect_to 永久重定向 "/index" http - 301     # # 永久重定向 不执行视图函数直接跳转 301 
subdomain 子域名配置 必须和 app中的 SERVER_NAME 联动

from flask import Flask, render_template, url_for
import time

app = Flask(__name__)


def wrapper(func):
    def inner(*args, **kwargs):
        st = time.time()
        ret = func(*args, **kwargs)
        et = time.time()
        ut = et - st
        # print(f'耗时{ut}')
        return ret

    return inner


@app.route('/index')
@wrapper
def index():
    return "hello"


@app.route('/home', endpoint='home')
@wrapper
def home():
    return render_template('home.html')



def login():
    print('这里是login')
    print(url_for('inner'))
    print(url_for('home'))
    print(url_for('login'))
    print(url_for('my_custom'))
    return 'login'



@app.route('/work', endpoint='my_custom')
def work():
    return

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

if __name__ == '__main__':
    app.run(debug=True)
url_for

 

@app.route('/work', endpoint='my_custom', defaults={'sid': 11, 'arg': 'hello'})
def work(sid, arg):
    return str(sid) + arg
defaults
@app.route('/work', endpoint='my_custom', defaults={'sid': 11, 'arg': 'hello'}, strict_slashes=True)
def work(sid, arg):
    return str(sid) + arg
strict_slashes

 

@app.route('/work', endpoint='my_custom', defaults={'sid': 11, 'arg': 'hello'}, strict_slashes=True, redirect_to='/login')
def work(sid, arg):
    return str(sid) + arg
redirect_to

 

# 动态路由参数
@app.route('/index/<int:nid>')    # 限制参数类型int
@app.route('/index/<string:nid>')  # 限制参数类型str
@app.route('/index/<nid>')    # 不限制参数类型

# @app.route('/test/<int:nid>')
# @app.route('/test/<string:arg>')
@app.route('/test/<arg>')
def test(arg):
    return arg
动态路由参数

 

2.Flask实例化配置
template_folder="template" 更改模板存放目录
static_folder="statics" 更改静态文件存放目录
static_url_path="/s" 更改静态文件访问路径 默认- /static_folder

from flask import Flask, render_template

app = Flask(__name__, template_folder="template",static_folder='static1', static_url_path='/s')

@app.route('/photo')
def photo():
    return render_template('photo.html')


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

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>photo</h1>
<img src="../static1/02.jpg" alt="pic">
<img src="/s/02.jpg" alt="pic">
</body>
</html>
photo.html 代码

 


3.Flask app对象配置   Session
class MyConfig(object):
DEBUG=True
SECRET_KEY = "23456789#$%^&*()"     # 秘钥
SESSION_COOKIE_NAME = "sssss"      # 修改session的名字, 默认是session

app.config.from_object(MyConfig)
app.config.from_json("json文件")

 

from flask import Flask, render_template, jsonify, session

app = Flask(__name__, template_folder="template", static_folder='static1', static_url_path='/s')

# 参见default_config = ImmutableDict中的默认配置项
# app.config['SECRET_KEY'] = '^(%&*(*'
# app.config['DEBUG'] = True
# app.config['TESTING'] = True
# app.config['JSONIFY_MIMETYPE'] = 'application/json222'   # 更改请求头中的Content-Type


from settings import MyConfig, ConfigTesting

# app.config.from_object(MyConfig)
# app.config.from_object(ConfigTesting)    # 自定义类
app.config.from_json('my_config.json')     # json 文件


@app.route('/photo')
def photo():
    return render_template('photo.html')


@app.route('/get_json')
def get_json():
    session['user'] = '123dd'
    return jsonify({'name': 'Alice'})



if __name__ == '__main__':
    app.run()
修改default_config
"""
{
        'ENV':                                  None,
        'DEBUG':                                None,
        'TESTING':                              False,
        'PROPAGATE_EXCEPTIONS':                 None,
        'PRESERVE_CONTEXT_ON_EXCEPTION':        None,
        'SECRET_KEY':                           None,
        'PERMANENT_SESSION_LIFETIME':           timedelta(days=31),
        'USE_X_SENDFILE':                       False,
        'SERVER_NAME':                          None,
        'APPLICATION_ROOT':                     '/',
        'SESSION_COOKIE_NAME':                  'session',
        'SESSION_COOKIE_DOMAIN':                None,
        'SESSION_COOKIE_PATH':                  None,
        'SESSION_COOKIE_HTTPONLY':              True,
        'SESSION_COOKIE_SECURE':                False,
        'SESSION_COOKIE_SAMESITE':              None,
        'SESSION_REFRESH_EACH_REQUEST':         True,
        'MAX_CONTENT_LENGTH':                   None,
        'SEND_FILE_MAX_AGE_DEFAULT':            timedelta(hours=12),
        'TRAP_BAD_REQUEST_ERRORS':              None,
        'TRAP_HTTP_EXCEPTIONS':                 False,
        'EXPLAIN_TEMPLATE_LOADING':             False,
        'PREFERRED_URL_SCHEME':                 'http',
        'JSON_AS_ASCII':                        True,
        'JSON_SORT_KEYS':                       True,
        'JSONIFY_PRETTYPRINT_REGULAR':          False,
        'JSONIFY_MIMETYPE':                     'application/json',
        'TEMPLATES_AUTO_RELOAD':                None,
        'MAX_COOKIE_SIZE': 4093,
    }
"""


class MyConfig(object):
    DEBUG = True
    SECRET_KEY = '^&*^*('
    SESSION_COOKIE_NAME = 'my_session_name'


class ConfigTesting(object):
    TESTING = True
    SECRET_KEY = "DFASGS"
    SESSION_COOKIE_NAME = 'customized_session_name'
创建settings.py, 自定义config

 这个session 是序列化后(加密)存放在客户端的Cookies中 默认名称为 session


4.特殊装饰器
before_request 在请求进入视图函数之前 做出响应
after_requset 在视图函数处理之后 响应返回客户端之前

正常情况:be1 - be2 - be3 - views - af3 - af2 - af1 返回顺序是定义代码时的倒序

    before_request 返回值none

    after_request  要接收一个参数response, 并返回这个参数

    

异常情况:be1 - af3 - af2 - af1 异常阻塞请求的情况

 

    当只存在be1和af1, af2, af3时, 返回顺序是  be1 - views - af3 - af2 - af1

@app.errorhandler(404) # 重定义错误提示
def error404(arg):
print(arg)
return redirect("https://www.autohome.com.cn/beijing/asdfgasdfasdf")

before_first_request

 

from flask import Flask, render_template, session, request, redirect

app = Flask(__name__)

app.template_folder = 'template'

app.config['SECRET_KEY'] = '^&^$^%^*'


# 只在第一次请求之前执行, 之后的请求不执行
@app.before_first_request
def first_rq():
    print('before first request')
    return


@app.before_request
def be1():
    print('我是be1')
    if request.path == '/login':
        return None
    if session:
        return None
    else:
        return redirect('/login')


# @app.before_request
# def be1():
#     print('我是be2')
#     return None
#
# @app.before_request
# def be1():
#     print('我是be3')
#     return None


@app.after_request
def af1(res):
    print(res)
    print('我是af1')
    return res


@app.after_request
def af1(res):
    print('我是af2')
    return res


@app.after_request
def af1(res):
    print('我是af3')
    return res


@app.route('/')
def index():
    print('进入视图函数了')
    return "test for before_request"


@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    elif request.form.get('username') and request.method == "POST":
        print(request.form.get('username'))
        session['user'] = request.form.get('username')
        return render_template('login.html')  # 修改了template_folder, pycharm识别错误飘黄


@app.errorhandler(404)  # 里面参数放错误码或错误名
def error404(arg):
    print(arg)
    return render_template('404.html')


if __name__ == '__main__':
    app.run()
before&after request

 


5.Flask 蓝图Blueprint  

  蓝图概念

 

from flask import Flask, Blueprint, render_template

user = Blueprint('user', __name__, template_folder='templateB')

@user.route('/user')
def users():
    return render_template('user.html')
user.py
from flask import Blueprint

custom = Blueprint('custom', __name__, url_prefix='/cus')  # 路由前缀添加 http://127.0.0.1:5000/cus/custom


@custom.route('/custom')
def test():
    return "我是蓝图22222"
blueprint02.py
from flask import Flask
from user import user
from blueprint02 import custom

app = Flask(__name__)
app.register_blueprint(user)
app.register_blueprint(custom)

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

 

 

 

 

from flask import Blueprint

ac_bp = Blueprint("acc",__name__,url_prefix="/ac")

@ac_bp.route("/acc")
def accs():
return "I am acc Blueprint"

 

from flask import Flask
app = Flask(__name__)

from s2.user import user_bp
from s2.acc import ac_bp
app.register_blueprint(user_bp)
app.register_blueprint(ac_bp)

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

 



posted @ 2019-02-26 17:55  SuraSun  阅读(147)  评论(0)    收藏  举报