Flask基础知识点2

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 怒发冲冠,凭栏处、潇潇雨歇。抬望眼,仰天长啸,壮怀激烈。三十功名尘与土,八千里路云和月。莫等闲,白了少年头,空悲切!靖康耻,犹未雪。臣子恨,何时灭!驾长车,踏破贺兰山缺。

怒发冲冠,凭栏处、潇潇雨歇。抬望眼,仰天长啸,壮怀激烈。三十功名尘与土,八千里路云和月。莫等闲,白了少年头,空悲切!
靖康耻,犹未雪。臣子恨,何时灭!驾长车,踏破贺兰山缺。壮志饥餐胡虏肉,笑谈渴饮匈奴血。待从头、收拾旧山河,朝天阙。

一、Flask的视图CBV

as_view中的name参数是在路由中endpoint参数不存在时代替endpoint来实现反向解析url的功能的,这个参数是必传的,在endpoint和name同时存在是name作用不生效!!!

两个视图类方法:

  • methods = ["GET","POST"] //视图类的方法
  • decorators = ["wrapper1","wrapper2"] //给类添加装饰器
from flask import Flask,url_for,views

app = Flask(__name__)

class Index(views.MethodView):
    methods = ["GET","POST"]   //视图类的方法
    decorators = ["wrapper1","wrapper2"]   //给类添加装饰器

    def get(self):
        print(url_for("indexs"))
        return "this is GET request"

    def post(self):
        return "this is POST request"

app.add_url_rule("/index", view_func=Index.as_view(name = "indexs"))

app.run()

二、Flask中的插件Flask-Session

  • 下载Flask-Session:
    pip3 install redis
    pip3 install Flask-Session
  • 导入:
    from flask import Flask, session
    from flask_session import Session
    from redis import Redis
  • 配置:
    app.config["SESSION_TYPE"] = "redis"
    app.config["SESSION_REDIS"] = Redis(host="127.0.0.1",port=6379,db=5)
  • 替换:
    Session(app)
  • 使用:
    设置:session["user"] = "aasdf"
    取值:session.get("user")

使用示例:

from flask import Flask, url_for, views
from flask_session import Session
from flask import session
from redis import Redis

app = Flask(__name__)

app.config["SESSION_TYPE"] = "redis"
app.config["SESSION_REDIS"] = Redis(host="127.0.0.1", port=6379, db=5)
app.secret_key = "wangjifei111"   //可有可无

Session(app)

class Index(views.MethodView):

    def get(self):
        session["name"] = "wangjifei"
        return "this is GET request"

    def post(self):
        return "this is POST request"

app.add_url_rule("/index", view_func=Index.as_view("indexs"))

app.run()

三、Flask中的WTforms的使用(和Django的form非常类似,就不累述了)

  • 下载:
    pip3 install wtforms

  • 简单使用:

from flask import Flask, url_for, views, render_template, request
from flask_session import Session
from flask import session
from redis import Redis
from wtforms.fields import simple, core
from wtforms import Form
from wtforms import validators

app = Flask(__name__)

app.config["SESSION_TYPE"] = "redis"
app.config["SESSION_REDIS"] = Redis(host="127.0.0.1", port=6379, db=5)

Session(app)


class LoginForm(Form):
    username = simple.StringField(
        label="用户名",
        validators=[
            validators.DataRequired(message="数据不能为空"),
            validators.Length(min=5, max=16, message="大于5小于16")
        ],
        render_kw={"class": "form-control"}
    )

    password = simple.PasswordField(
        label="密码",
        validators=[
            validators.DataRequired(message="数据不能为空"),
            validators.Length(min=5, max=16, message="大于5小于16"),
            validators.Regexp(regex="\d+", message="密码必须为数字")
        ],
        render_kw={"class": "form-control"}
    )

class Login(views.MethodView):
    def get(self):
        loginfm = LoginForm()
        return render_template("login.html", login_html=loginfm)

    def post(self):
        loginfm = LoginForm(request.form)
        if not loginfm.validate():
            return render_template("login.html", login_html=loginfm)
        session["user"] = "wangjifei"
        return "登陆成功"

app.add_url_rule("/login", endpoint="class_login", view_func=Login.as_view(name="login"))
app.run()

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>login界面</title>
    <link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.css" rel="stylesheet">
</head>
<body>

<div class="row">
    <div class="col-md-8 col-md-offset-2">
        <form action="" method="post">
            {% for field in login_html %}
                <div class="form-group">
                    {{ field.label }}:{{ field }}<br>{{ field.errors.0 }}
                </div>
            {% endfor %}
            <input type="submit" class="btn btn-seccess" value="提交">
        </form>
    </div>
</div>
</body>
</html>
  • 略微复杂的使用:
from flask import Flask, url_for, views, render_template, request
from flask_session import Session
from flask import session
from redis import Redis
from wtforms.fields import simple, core
from wtforms import Form
from wtforms import validators

app = Flask(__name__)

app.config["SESSION_TYPE"] = "redis"
app.config["SESSION_REDIS"] = Redis(host="127.0.0.1", port=6379, db=5)

Session(app)

class RegForm(Form):
    username = simple.StringField(
        label="用户名",
        validators=[
            validators.DataRequired(message="数据不能为空"),
            validators.Length(min=5, max=16, message="大于5小于16")
        ],
        render_kw={"class": "form-control"}
    )

    password = simple.PasswordField(
        label="密码",
        validators=[
            validators.DataRequired(message="数据不能为空"),
            validators.Length(min=5, max=16, message="大于5小于16"),
            validators.Regexp(regex="\d+", message="密码必须为数字")
        ],
        render_kw={"class": "form-control"}
    )

    repassword = simple.PasswordField(
        label="密码",
        validators=[
            validators.DataRequired(message="数据不能为空"),
            validators.EqualTo("password", message="两次密码不一致")
        ],
        render_kw={"class": "form-control"}
    )

    gender = core.RadioField(
        label="性别",
        choices=(
            (1, "女"),
            (2, "男"),
            (3, "未知")
        ),
        coerce=int,
        default=3,
    )

    hobby = core.SelectMultipleField(
        label="嗜好",
        choices=[(1, "健身"),(2,"喝酒"),(3,"旅游")],
        coerce=int,
        default=1,
        render_kw={"class": "form-control"}
    )

@app.route("/register", methods=["GET", "POST"])
def reg():
    if request.method == "GET":
        regfm = RegForm()
        return render_template("reg.html", reg_html=regfm)
    else:
        regfm = RegForm(request.form)
        if not regfm.validate():
            return render_template("reg.html", reg_html=regfm)

        print(regfm.data.get("hobby"),
              regfm.data.get("gender")
              )

        return "注册成功"

app.run()

reg.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.css" rel="stylesheet">
</head>
<body>

<div class="row">
    <div class="col-md-8 col-md-offset-2">
        <form action="" method="post">
            {% for field in reg_html %}
                <div class="form-group">
                    {{ field.label }}:{{ field }}<br>{{ field.errors.0 }}
                </div>
            {% endfor %}
            <input type="submit" class="btn btn-seccess" value="提交">
        </form>
    </div>
</div>
</body>
</html>
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
存储 Python
【Flask实战】Flask知识点总结(三)— Flask-Login使用
【Flask实战】Flask知识点总结(三)— Flask-Login使用
|
存储 安全 数据库
|
数据库 索引 Python
|
SQL 关系型数据库 MySQL
Flask全套知识点从入门到精通,学完可直接做项目(四)
Flask全套知识点从入门到精通,学完可直接做项目(四)
171 0
Flask全套知识点从入门到精通,学完可直接做项目(四)
|
存储 SQL JSON
Flask全套知识点从入门到精通,学完可直接做项目(三)
Flask全套知识点从入门到精通,学完可直接做项目
396 0
Flask全套知识点从入门到精通,学完可直接做项目(三)
|
Web App开发 存储 前端开发
Flask全套知识点从入门到精通,学完可直接做项目(二)
Flask全套知识点从入门到精通,学完可直接做项目
236 0
Flask全套知识点从入门到精通,学完可直接做项目(二)
|
Web App开发 前端开发 搜索推荐
Flask全套知识点从入门到精通,学完可直接做项目(一)
Flask全套知识点从入门到精通,学完可直接做项目
424 0
Flask全套知识点从入门到精通,学完可直接做项目(一)
|
JSON API 数据格式
Python Flask学习知识点(二)
使用Flask写简单的API 所有API都一样,不限于编程语言,API的难点在于路由(URL)的设计,能否精准的找到资源,而不是在于如何用技术实现。
1156 0
|
数据格式 Python 内存技术
Flask基础知识点1
一、.基于装饰器的session访问控制,endpoint路由参数可以解决视图函数重名的情况。 下面我有一个简单的需求,就是一个网站有三个页面,分别是home、index和login界面,用户只有当登陆后才可以正常访问home和index页面,通过装饰器的方法来实现。
1234 0
|
Python 文件存储 API
Python Flask学习知识点(七)
timg (11).jpg 静态文件访问原理 app文件夹下新建文件夹static,放入一张图片demo.jpg,然后访问服务器启动默认地址127.0.0.1:81/static/demo.jpg就可以访问到这张图片。
1448 0