Python-Flask框架

Flask是一个使用Python编写的轻量级 Web 应用框架。其WSGI工具箱采用 Werkzeug ,模版引擎则使用 Jinja2 。Flask使用 BSD 授权。Flask也被称为 “microframework” ,因为它使用简单的核心,用 extension 增加其他功能。Flask没有默认使用的数据库、窗体验证工具。

flask中文文档:Flask 中文网

flask官网:Welcome to Flask — Flask Documentation (3.0.x)        

目录

一、创建一个Flask项目

在项目文件中创建基本文件

在终端中下载flask模块

在app.py中编写基本flask架构

启动flask项目 

二、定义网页链接

基本代码

在根路由下显示Hello Word!文字界面

在/profile路径下显示“我是个人中心” 

 在url上传blog_id后显示在网页上

 三、渲染静态文件

 四、将数据传输给html

第一种:指定数据传到指定html

第二种:将数据从url中传给html

 五、过滤器

 六、控制代码块

七、Web表单 

 八、flash消息闪现

九、文件上传

十、Cookies相关操作

十一、重定向和错误

十二、响应 

十三、Python中的中文字符编码问题


一、创建一个Flask项目

在项目文件中创建基本文件

基本文件
文件名文件类型说明
static文件夹用于存储静态文件
templates文件夹用于存放html文件
app.pypython文件用于编写flask框架

在终端中下载flask模块

pip install flask

在app.py中编写基本flask架构

详细说明:

引入flask模块

 from flask import Flask

使用Flask创建一个对象为app(可以不为app,默认是app) 

其中 “__name__”代表当前app.py这个模块

app = Flask(__name__)

创建一个根路由

@对象名.route('路由地址')

定义一个对象,返回页面中显示的数据

注意:一个路由只能有一个方法

@app.route('/')

def hello_word():

    return 'Hello World3232323!'

执行文件

debug:是否自动更新(监听)

host:设置host地址

port:设置端口号

if __name__ == '__main__':

    app.run(debug=True,host='0.0.0.0',port=8080)

启动flask项目 

在项目根目录下运行

python -m flask run

二、定义网页链接

基本代码

说明 

在根路由下显示Hello Word!文字界面

@app.route('/')

def hello_word():

    return 'Hello World!'

在/profile路径下显示“我是个人中心” 

# 定义URL

@app.route('/profile')

def profile():

    return '我是个人中心'

 在url上传blog_id后显示在网页上

@app.route('/blog/<int:blog_id>')

def blog_detail(blog_id):

    return f'您访问的博客是:{blog_id}'

例如我的url为 http://127.0.0.1:5000/blog/1234

在网页上就会显示后面的1234,将url上的值传到了网页上

用get方法传值传到页面上

@app.route('/book/list')

def book_list():

    page = request.args.get("page",default=1,type=int)

    return f"您的获取的是第{page}的图书列表"

这里使用了flask模块下的request模块,发送的是一个page的值,默认为1,类型为int型

第一个参数值的名称
第二个参数:default默认值
第三个参数:type值的类型

 总结:这些一个个不同的路由地址构建成了一个庞大的网页链接

 三、渲染静态文件

  • 创建一个名为 static 的文件夹就行了。 静态文件位于应用的 /static 中
url_for('static', filename='style.css')

 四、将数据传输给html

第一种:指定数据传到指定html

使用flask模块下的render_template模块给指定网页传输数据

定义一个User 类包含名称和邮箱地址

@app.route('/')

def hello_word():

    user = User(username="知网",email="xx@qq.com")

    person = {

        'username':'张三',

        'email':'qisjidq张三@qq.com'

    }

    return render_template("index.html",user=user,person = person)

定义一个字典persn,在render_template中赋值,将数据传输给前端

在前端使用{{数据名称}}获取:

第二种:将数据从url中传给html

在该路由的方法中传值,然后渲染到指定网页上

格式:<转换器类型:传递的值>

@app.route('/blog/<int:blog_id>')

def blog_detail(blog_id):

    # 给前端传blog_id数据

  return render_template("blog_detail.html",blog_id=blog_id,username="知网" )
转换器类型
string接受任何不包含斜杠的文本
int接受正整数
float接受正浮点数
path类似 string ,但可以包含斜杠
uuid接受 UUID 字符串

注意:这里的HTML模版都应放在templates文件夹下

 五、过滤器

向前端传输数据

@app.route('/filtter')#过滤器
def filtter_demo():
    user = User(username="知网xxxx",email="xx@qq.com")
    mytime = datetime.now()
    //向前端返回filtter.html页面,并传user,mytime 值
    return render_template('filtter.html',user= user,mytime = mytime)

 在html中使用过滤器

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>过滤器使用demo</title>
</head>
<body>
    //{{user.username|length}}渲染返回user.username长度
    <div> {{user.username}}---{{user.username|length}}</div>
    <div>{{mytime|dformat}}</div>
</body>
</html>
flask常见的内置过滤器
过滤器名称作用对象描述
safe字符串禁用转义
capitalize字符串把变量值的首字母转写成大写,其余字母转小写
lower字符串把值转成小写
upper字符串把值转成大写
title字符串把值中的每个单词的首字母都转成大写
reverse字符串字符串反转
format字符串格式化输出
striptags字符串渲染之前把值中所有的HTML标签都删掉
truncate字符串字符串截断
first列表取第一个元素
last列表取最后一个元素
length列表获取列表长度
sum列表列表求和
sort列表列表排序

 六、控制代码块

  • if判断
<!-- if判断 -->
{% if age>18%}
<div> 您已经满18岁,可以进入网吧</div>
{%elif age==18%}
<div>您刚满18岁,需要父母陪同才能进入网吧</div>
{%else%}
<div>您未满18岁不能进入网吧</div>
{%endif%}
  • for循环 
{% for book in books%}
<div>图书名称:{{book.name}} 图书作者:{{book.author}}
</div>
{%endfor%}

七、Web表单 

  • 使用Flask-WTF扩展处理Web表单
WTForms支持的HTML标准字段
字段对象说明
StringField文本字段
TextAreaField多行文本字段
PasswordField密码文本字段
HiddenField隐藏文件字段
DateField文本字段,值为datetime.date文本格式
DateTimeField文本字段,值为datetime.datetime文本格式
IntegerField文本字段,值为整数
DecimalField文本字段,值为decimal.Decimal
FloatField文本字段,值为浮点数
BooleanField复选框,值为True和False
RadioField一组单选框
SelectField下拉列表
SelectMutipleField下拉列表,可选择多值
FileField文件上传字段
SubmitField表单提交按钮
FormField把表单作为字段嵌入另一个表单
FieldList一组指定类型的字段
WTForms常用验证函数
验证函数说明
DataRequired确保字段中有数据
EqualTo比较两个字段的值,常用于比较两次密码输入
Length验证输入的字符串长度
NumberRange验证输入的值在数字范围内
URL验证URL
AnyOf验证输入值在可选列表中
NoneOf验证输入值不在可选列表中

注意:使用Flask-WTF需要配置参数SECRET_KEY,CSRF_ENABLED是为了CSRF(跨站请求伪造)保护。SECRET_KEY用来生成加密令牌,当CSRF激活的时候,该设置会根据设置的密钥生成加密令牌

  • 常规实现from表单

HTML模版 

<form action="" method="post">
    <label>用户名:</label><input type="text" name="username" id=""><br>
    <label>密码:</label><input type="text" name="password" id=""><br>
    <label>确认密码:</label><input type="text" name="password2" id=""><br>
    <input type="submit" value="提交"><br> 
</form>

Python 

# methods=['GET','POST']判断请求的方式
@app.route('/',methods=['GET','POST'])
def Index():
    # 如果是POST请求就返回success
    if request.method == 'POST':
        # 获取请求的参数
        username = request.form.get('username')
        password = request.form.get('password')
        password2 = request.form.get('password2')
        #   判断参数是否完整;
        if not all([username,password,password2]):
            print( '参数不完整')
        elif password != password2:
            print ('两次密码不一致')
        else:
            return 'success'
    return render_template("static.html")
  • 获取get请求参数

操作 URL(URL?key=value)中提交的参数可以使用args属性

searchword = request.args.get('key', '')

 八、flash消息闪现

  • 常用于from表单验证
from flask import Flask,render_template,request,flash
from datetime import datetime

app = Flask(__name__)
app.secret_key = 'WDEP'#设置加密的key
@app.route('/',methods=['GET','POST'])
def Index():
    if request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')
        password2 = request.form.get('password2')
        if not all([username,password,password2]):
            #设置返回闪存消息
            flash(u'参数不完整')  #使用flash消息闪现必须给app设置加密key
        elif password != password2:
            flash(u'两次密码不一致') #在字符串里面添加u,表示字符串是unicode编码
        else:
            return 'success'
    return render_template("static.html")

if __name__ == '__main__':
    app.run(debug=True)
<form action="" method="post">
     <label>用户名:</label><input type="text" name="username" id=""><br>
     <label>密码:</label><input type="text" name="password" id=""><br>
     <label>确认密码:</label><input type="text" name="password2" id=""><br>
     <input type="submit" value="提交"><br>
     #获取并显示闪存消息
     {% for message in get_flashed_messages() %} {{ message }} {% endfor %}
</form>

九、文件上传

十、Cookies相关操作

  • 读取Cookies
from flask import request

@app.route('/')
def index():
    username = request.cookies.get('username')
  • 存储Cookies
from flask import make_response

@app.route('/')
def index():
    resp = make_response(render_template(...))
    resp.set_cookie('username', 'the username')
    return resp

注意: cookies 设置在响应对象上。通常只是从视图函数返回字符串, Flask 会把它们 转换为响应对象。如果你想显式地转换,那么可以使用make_response()函数,然后再修改它

十一、重定向和错误

  • 使用redirect()函数可以重定向。使用abort()可以更早退出请求
from flask import abort, redirect, url_for

@app.route('/')
def index():
    return redirect(url_for('login'))

@app.route('/login')
def login():
    abort(401)
    this_is_never_executed()

十二、响应 

  •  使用errorhandler()定制出错页面
from flask import render_template

@app.errorhandler(404)
def page_not_found(error):
    return render_template('page_not_found.html'), 404

注意: render_template()后面的404,这表示页面的状态码是404

  • 使用make_response()包裹返回表达式
@app.errorhandler(404)
def not_found(error):
    resp = make_response(render_template('error.html'), 404)
    resp.headers['X-Something'] = 'A value'
    return resp
  • 使用JSON格式的API
@app.route("/me")
def me_api():
    user = get_current_user()
    #返回一个dict,那么它会被转换为一个JSON响应
    return {
        "username": user.username,
        "theme": user.theme,
        "image": url_for("user_image", filename=user.image),
    }


#或使用jsonify()函数
@app.route("/users")
def users_api():
    users = get_all_users()
    return jsonify([user.to_json() for user in users])

十三、中文字符编码问题

#单个解决(在字符前面+u)
flash(u'解决问题')

#
# 全局一次性解决编码问题
import sys
reload(sys)
sys.setdefaultencoding('utf8')

十四、Flask使用SQL数据库

  • 使用flask-sqlalchemy操作数据库
pip install flask-sqlalchemy
  • 如果使用Mysql则需要安装mysqldb
pip install flask-mysqldb

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WDEP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值