Flask---响应、模板、session、before_request、中间件、flash、项目结构

响应

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

@app.route('/index',methods=['GET','POST'])
def index():
    # 请求相关
    # request.method
    # request.args
    # request.form
    # request.cookies
    # request.headers
    # request.path
    # request.files
    # obj = request.files['the_file_name']
    # obj.save('/var/www/uploads/' + secure_filename(obj.filename))

    # request.values
    # request.full_path
    # request.script_root
    # request.url
    # request.base_url
    # request.url_root
    # request.host_url
    # request.host



    # 响应相关
    return ""
    return json.dumps({}) # return jsonify({})
    return render_template('index.html',n1=123)
    return redirect('/index')


    # response = make_response(render_template('index.html'))
    # response = make_response("xxxx")
    # response.set_cookie('key', 'value')
    # response.headers['X-Something'] = 'A value'
    # response.delete_cookie('key')
    # return response


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

模板

from flask import Flask,render_template,redirect,request,jsonify,make_response,Markup
app = Flask(__name__)


def gen_input(value):
    return Markup("<input value='%s'/>" %value)

@app.route('/x1',methods=['GET','POST'])
def index():
    context = {
        'k1':123,
        'k2': [11,22,33],
        'k3':{'name':'oldboy','age':84},
        'k4': lambda x: x+1,
        'k5': gen_input, # 当前模板才能调用的函数
    }

    return render_template('index.html',**context)


@app.template_global()
def sbbbbbbb(a1, a2):
    return a1 + a2

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

layout.html

<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Title</title>
</head>
<body>
    <div >头部</div>
    <div>
        {% block content %} {% endblock %}
    </div>
    <div >底部</div>
</body>
</html>

index.html

{% extends 'layout.html'%}

{% block content %}
    <h1>{{k1}}</h1>
    <h1>{{k2.0}}  {{k2[0]}} </h1>
    <h1>{{k3.name}}  {{k3['name']}}  {{k3.get('name',888)}}</h1>
    <h1>{{k4(66)}}</h1>
    <h1>{{k5(99)}}</h1>
    <h1>{{sbbbbbbb(1,2)}}</h1>
{% endblock%}

浏览器输出

头部
123
11 11
oldboy oldboy oldboy
67
input文本(文本内容是99)
99
3
底部

session


from flask import Flask,session
app = Flask(__name__)
app.secret_key = 'sadfasdfasdf'

@app.route('/x1')
def index():
    # 去ctx中获取session
    session['k1'] = 123
    session['k2'] = 123

    return "Index"


@app.route('/x2')
def order():
    print(session.get("k2"))
    return "Order"

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

首先http://127.0.0.1:5000/x1
这里写图片描述

然后http://127.0.0.1:5000/x2
这里写图片描述

然后在index中,del session['k2'],在order中改成 print(session.get(“k1”))
这里写图片描述

before_request、after_request

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

"""
before_reuqest = [xxxxxxxxxx1,xxxxxxxxxx2]
"""
@app.before_request
def xxxxxxxxxx1():
    print('前1')

@app.before_request
def xxxxxxxxxx2():
    print('前2')


"""
after_request = [oooooooo1,oooooooo2]
[oooooooo2,oooooooo1,] reversed(after_request)
"""
@app.after_request
def oooooooo1(response):
    print('后1')
    return response

@app.after_request
def oooooooo2(response):
    print('后2')
    return response



@app.route('/x1',methods=['GET','POST'])
def x1():
    print('视图函数x1')
    return "视图函数x1"

@app.route('/x2',methods=['GET','POST'])
def x2():
    print('视图函数x2')
    return "视图函数x2"

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

浏览器http://127.0.0.1:5000/x1
控制台输出

前1
前2
视图函数x1
后2
后1
from flask import Flask,render_template,redirect
app = Flask(__name__)

@app.before_request
def xxxxxxxxxx1():
    print('前1')
    return "不要再来烦我了"

@app.before_request
def xxxxxxxxxx2():
    print('前2')

@app.after_request
def oooooooo1(response):
    print('后1')
    return response

@app.after_request
def oooooooo2(response):
    print('后2')
    return response



@app.route('/x1',methods=['GET','POST'])
def x1():
    print('视图函数x1')
    return "视图函数x1"

@app.route('/x2',methods=['GET','POST'])
def x2():
    print('视图函数x2')
    return "视图函数x2"

if __name__ == '__main__':

    app.run()

浏览器输入http://127.0.0.1:5000/x2
页面输出不要再来烦我了
控制台输出

前1
后2
后1

实现登陆验证

from flask import Flask,render_template,redirect,request,session
app = Flask(__name__)
app.secret_key = 'asdfasdfasdf'
@app.before_request
def check_login():
    if request.path == '/login':
        return None
    user = session.get('user_info')
    if not user:
        return redirect('/login')

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

@app.route('/index',methods=['GET','POST'])
def index():
    print('视图函数x2')
    return "视图函数index"

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

中间件

from flask import Flask
app = Flask(__name__)
app.secret_key = 'asdfasdfasdf'

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


class Middleware(object):
    def __init__(self,old_wsgi_app):
        """
        服务端启动时,自动执行
        :param old_wsgi_app:
        """
        self.old_wsgi_app =old_wsgi_app

    def __call__(self, environ, start_response):
        """
        每次有用户请求道来时
        :param args:
        :param kwargs:
        :return:
        """
        print('before')
        from flask import session,request
        obj = self.old_wsgi_app(environ, start_response)
        print('after')
        return obj

if __name__ == '__main__':
    app.wsgi_app = Middleware(app.wsgi_app)
    app.run()
    """
    1.执行app.__call__
    2.在调用app.wsgi_app方法
    """

浏览器输入http://127.0.0.1:5000/x2
控制台输出

before
x2
after

flash

from flask import Flask,session,flash,get_flashed_messages
app = Flask(__name__)
app.secret_key = 'asdfasdfasdf'

@app.route('/x1',methods=['GET','POST'])
def login():
    flash('我要',category='x1')
    flash('我要',category='x2')
    return "视图函数login"

@app.route('/x2',methods=['GET','POST'])
def index():
    data = get_flashed_messages(category_filter=['x1'])
    print(data)
    return "视图函数index"

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

浏览器输入http://127.0.0.1:5000/x2
控制台输出[]

浏览器输入http://127.0.0.1:5000/x1(多刷新几次)
然后在输入http://127.0.0.1:5000/x2
会在控制台输出['我要', '我要', '我要', '我要', '我要']
然后取完毕,在输入http://127.0.0.1:5000/x2
控制台输出[]

项目结构

这里写图片描述
通过python manage.py启动项目
manage.py

from s8pro import app

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

__init__.py

from flask import Flask
from .views import account
from .views import admin
from .views import user

app = Flask(__name__)

app.register_blueprint(account.ac)
app.register_blueprint(admin.ad)
app.register_blueprint(user.us)

account.py

from flask import Blueprint,render_template
import redis

ac = Blueprint('ac',__name__)

@ac.route('/login')
def login():
    conn = redis.Redis()
    return render_template('login.html')


@ac.route('/logout')
def logout():
    return '大人'

login.html

<body>
    <h1>用户登录</h1>
</body>

http://127.0.0.1:5000/login输出login.html信息
http://127.0.0.1:5000/logout 页面输出大人

还可以设置二级路由
admin.py

from flask import Blueprint

ad = Blueprint('ad',__name__,url_prefix='/admin')

@ad.before_request
def bf():
    print('before_request')


@ad.route('/home')
def home():
    return 'home'

@ad.route('/xxxx')
def xxxx():
    return 'xxxx'

浏览器输出http://127.0.0.1:5000/admin/home
控制台输出before_request

user.py

from flask import Blueprint


us = Blueprint('us',__name__)

@us.route('/info')
def info():
    return 'info'

项目依赖

这里写图片描述

  • 项目依赖 pip3 install pipreqs
    - 生成依赖文件:pipreqs ./
    - 安装依赖文件:pip3 install -r requirements.txt
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值