Flask 框架

目录

Flask介绍和安装

请求与响应

请求

响应

登录案例

配置文件写法

路由系统

路由写法

转换器

CBV

session的使用和原理

flask-session的使用

闪现flash

请求扩展

g对象

蓝图

小型蓝图

大型蓝图

数据库连接池

wtforms

信号

内置信号

自定义信号

flask-script


Flask介绍和安装

python web框架

同步框架:

  • Django:大而全(3.x以后支持异步)
  • flask:小而精,插件的支持

异步框架:Sanic、FastAPI

flask介绍

Flask是一个基于Python开发并且依赖jinja2模板(DTL)和Werkzeug WSGI(符合wsgi协议的web服务器,wsgiref)服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器。

flask安装

pip install flask

简单使用

from flask import Flask
# 名字随意
app = Flask('main')
# 路由
@app.route('/')
def index():
    return 'hello world'

if __name__ == '__main__':
    # 运行
    app.run()

访问:

http://127.0.0.1:5000/

请求与响应

请求

flask中获取请求的数据都是通过全局的模块:request。虽然是全局,但是用起来确实各自独立的。

from flask import request
请求方法 作用
request.method 请求方式
request.args get 请求参数
request.form post 请求参数
request.values get,post请求的参数总和
request.files 文件
request.cookies 请求cookies
request.headers 请求头
request.path 服务器地址后面的路径(不带get请求参数)
request.full_path 服务器地址后面的路径(带get请求参数)
request.url 带服务器地址的路径(带get请求参数)
request.base_url 带服务器地址的路径(不带get请求参数)
request.url_root 服务器IP地址:端口
request.host_url 服务器IP地址:端口
request.host 服务器IP地址:端口(不带http)

响应

返回字符串

类比django中HttpResponse('字符串')

from flask import Flask
# 名字随意
app = Flask('main')
# 路由
@app.route('/')
def index():
    return '字符串'

if __name__ == '__main__':
    # 运行
    app.run()

返回模板(网页)

类比django中Render(request,模板,{})

from flask import Flask, render_template
# 名字随意
app = Flask('main')
# 路由
@app.route('/')
def index():
    return render_template(模板, 参数1=?, 参数2=?)

if __name__ == '__main__':
    # 运行
    app.run()

返回重定向

类比django中Redirect('路由')

from flask import Flask, redirect
# 名字随意
app = Flask('main')
# 路由
@app.route('/')
def index():
    return redirect('路由')

if __name__ == '__main__':
    # 运行
    app.run()

返回json

类比django中JsonResponse

from flask import Flask, jsonify
# 名字随意
app = Flask('main')
# 路由
@app.route('/')
def index():
    return jsonify(字典或列表..)

if __name__ == '__main__':
    # 运行
    app.run()

响应包装

方法:

from flask import make_response

使用:

res = make_response(render_template('home.html'))
# 写入cookie
res.set_cookie('name','lqz')
# 删除cookie
res.delete_cookie('name')
# 添加响应头
res.headers[''] = ''
# 返回
return res

登录案例

功能:登录成功cookie保存,没有登录时无法访问特定页面。

目录结构:

项目名
 ├── templates  -- 网页文件夹,必须叫templates
 ├    ├── detail.html -- 单用户详情页
 ├    ├── index.html -- 用户列表
 ├    └── login.html -- 登录页面
 └── login.py -- 功能实现

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>用户列表</h1>
<table>
    {% for k,v in user_dict.items() %}
        <tr>
            <td>{
  { k }}</td>
            <td>{
  { v.name }}</td>
            <td>{
  { v['name']}}</td>
            <td>{
  { v.get('name')}}</td>
            <td><a href="/detail/{
  { k }}">查看详细</a></td>
        </tr>
    {% endfor %}
</table>
</body>
</html>

detail.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>详细信息 {
  { info.name }}</h1>
<div>
    {
  { info.text }}
</div>
</body>
</html>

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="" method="post">
    用户名<input type="text" name="username">
    密码<input type="password" name="password">
    <input type="submit" value="登录">
    <p>{
  { error }}</p>
</form>
</body>
</html>

login.py

from flask import Flask, render_template, redirect, jsonify, request, session
from functools import wraps

app = Flask('main')
app.secret_key = 'abcdd'  # 如果要使用session,必须写秘钥
# 用户信息,暂时用全局变量存储
USERS = {
    1: {'name': '张三', 'age': 18, 'gender': '男', 'text': "道路千万条"},
    2: {'name': '李四', 'age': 28, 'gender': '男', 'text': "安全第一条"},
    3: {'name': '王五', 'age': 18, 'gender': '女', 'text': "行车不规范"},
}


# 登录装饰器,判断是否登录
def login_decorator(func):
    @wraps(func)  # 装饰器修复技术
    def inner(*args, **kwargs):
        username = session.get('username')
        if username:
            return func(*args, **kwargs)
        else:
            # 没有登录返回登录页面
            return redirect('/login')

    return inner


@app.route('/')
@login_decorator
def index():
    return render_template('index.html', user_dict=USERS)


@app.route('/detail/<int:pk>')
@login_decorator
def detail(pk):
    return render_template('detail.html', info=USERS.get(pk))


# 只接受get和post请求
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    else:
        username = request.form.get('username')
        password = request.form.get('password')
        # 判断是否登录成功
        if username == 'tom' and password == '123':
            # cookie保存
            session['username'] = 'tom'
            # 成功跳转到http://127.0.0.1:5000/
            return redirect('/')
        else:
            # 登录失败给页面传参显示错误信息
            return render_template('login.html', error='用户名或密码错误')


if __name__ == '__main__':
    # 运行
    app.run()

配置文件写法

第一种:

app.secret_key='asfasdf'
app.deb
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值