相关文档

第一个应用程序

# 导入Flask扩展
from flask import Flask
# 创建Flask应用程序实例(需要传入__name__,作用是为了确定资源所在路径)
app = Flask(__name__)
# 定义路由及视图函数
# Flask中定义路由是通过装饰器实现的
# 路由默认支支持GET,如果需要增加,需要自行指定
@app.route('/',methods=['GET','POST'])
def index():
    return 'Hello wsj!'

# 使用同一个视图函数,来显示不同用户的订单信息
# <>定义路由的函数,<>内需要起个名字
# 有时候需要对路由做访问优化,订单ID应该是Int类型
@app.route('/orders/<int:order_id>')
def get_order_id(order_id):
    # 需要在视图函数的()内填入参数名才可以在后面的代码中使用
    # order_id参数,默认是字符串,unicode
    return 'order_id: %s' % order_id


# 启动程序
if __name__ == '__main__':
# 执行app.run就会将Flask程序运行在一个简易的服务器(Flask提供,用于测试)
    app.run(debug=True)

Jinja2模板使用

渲染模板函数

Flask提供的render_template函数封装了改模板引擎

render_template函数的第一个参数是模板的文件名,后面的参数都是键值对,表示模板中变量对应的真实值。

使用

注释

使用 {# #}进行注释

{# {{ name }} #}

变量代码块

{{}}来表示变量名,这种语法叫做变量代码块

{{ post.title }}

Jinja2模板中的变量代码块可以是任意Python类型或者对象,只要它能够被Python的str()方法转换为一个字符串就可以,比如,可以通过下面的方式显示一个字典或者列表中的某个元素

{{your_dict[‘key’]}}
{{your_list[0]}}

代码示例

index.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>This is template.Index</h1>
    <br>
    {# 下面是一个变量代码块的使用 #}
    {{ url_str }}<br>
    {# 列表的使用 #}
    {{ my_list }}<br>
    {{ my_list.2 }} {{ my_list[2] }}<br>
    {# 字典的使用 #}
    {{ my_dict }}<br>
    {{ my_dict.url }}<br>
    {{ my_dict['url'] }}<br>
</body>
</html>

app.py文件

@app.route('/',methods=['GET','POST'])
def index():
    url_str = 'centuryw.cn'
    my_list = [1,2,3,5]
    my_dict = {
        'name':'wsj',
        'url' :'centuryw.cn'
    }
    # 通常,模板中使用的变量名和要传递的数据的变量名保持一致
    return render_template(
        'index.html',
        url_str=url_str,
        my_list=my_list,
        my_dict=my_dict
    )

控制代码块

用{% %}定义的控制代码块,可以实现一些语言层次的功能,如循环或if语句

{% if user %}
{{ user }}
{% else %}
hello!
{% endif %}
{% for indedx in indexs %}
{{ index }}
{% endfor %}

示例:

    {# 控制代码块 {% %} #}
    {# fro 循环的使用,建议先写for,然后按tab进行补全 #}
    {% for num in my_list %}
      {# 数据大于3才能显示 #}
      {% if num > 3 %}
            {{ num }} <br>
        {% endif %}
    {% endfor %}

过滤器

过滤器的本质就是函数,有时候我们不仅仅只是需要输出变量的值,还需要修改变量的显示,甚至格式化、运算等,而在模板中不能直接调用Python中的某些方法,所以用到了过滤器。

使用方式:

  • 过滤器的使用方式为:变量名|过滤器
    • {{variable | filter_name{*args)}}
  • 如果没有任何参数传给过滤器,则可以把括号省略
    • {{variable | filter_name}}

链式调用

在jinja2中,过滤器是可以支持链式调用的

{{ “hello world” | reverse | upper }}

常见内建过滤器

字符串操作

  • safe:禁用转义
    • <p>{{ ‘hello‘ | safe }}</p>
  • capitalize:把变量值的首字母转换成大写,其余字母转小写
    • <p>{{ ‘hello’ | capitalize }}</p>
  • lower:把值转换成小写
    • <p>{{‘HELLO’ | lower}}</p>
  • upper:把值转换成大写
    • <p>{{‘hello’ | upper }}</p>
  • title:把值中的每个单词的首字母都转成大写
    • <p>{{ ‘hello’ | title }}</p>
  • reverse:字符串反转
    • <p>{{‘olleh’ | reverse }} </p>
  • format:格式化输出
    • <p>{{ ‘%s is %d’ | format(‘name’,17) }} </p>
  • striptags:渲染之前把值中所有的HTML标签都删掉
    • <p>{{‘<em>hello</em>’ | striptags }}</p>
  • truncate:字符串截断
    • <p>{{‘hello every one’ | truncate(9)}}</p>

列表操作

语句块过滤

{% filter upper %}
文字
{% endfilter %}

Web表单

web表单是web应用程序的基本功能

它是HTML页面中负责数据采集的部件。表单有三个部分组成:表单标签、表单域、表单按钮。表单允许用户输入数据,负责HTML页面数据采集,通过表单将用户输入的数据交给服务器。

在Flask中,为了处理web表单,一般使用Flask-WTF扩展,他封装了WTForms,并且它有验证表单数据的功能

WTForms支持的HTML标准字段

WTForms常用验证函数

使用Flask-WTF需要配置参数SECRET_KEY。

CSRF_ENABLED是为了CSRF(跨站请求伪造)保护。SECRET_KEY用来生成加密令牌,当CSRF激活的时候,改设置会根据设置的密钥生成加密令牌

示例

使用普通方式实现表单

在HTLML页面中直接写form表单

html文件

<form method="post">
        <label>name:</label><input type="text" name="username"><br>
        <label>passwd:</label><input type="password" name="password"><br>
        <label>verify</label><input type="password" name="password2"><br>
        <input type="submit" value='submit'><br>
        {# 使用遍历获取闪现的消息 #}
        {% for message in get_flashed_messages() %}
            {{ message }}
        {% endfor %}
</form>

视图文件

'''目的:实现一个简单的登陆的逻辑处理
1.路由需要有get和post两者请求方式 --> 需要判断请求方式
2.获取请求的参数
3.判断参数是否填写 & 密码是否相同
4.如果判断都没有问题,返回一个success
'''
# request: 请求对象 --> 获取请求方式、数据
# flash:给模板传递消息 模板中需要遍历消息 需要对内容加密,因此需要设置secret_key,做加密
app.secret_key = 'pass'
from flask import request,flash
@app.route('/login',methods=['GET','POST'])
def login():
    # 1.判断请求方式
    if request.method == 'POST':
        # 2.获取请求的参数
        username = request.form.get('username')
        password = request.form.get('password')
        password2 = request.form.get('password2')
        # 3.判断蚕食是否填写,密码是否相同
        if not all([username,password,password2]):
            flash('参数不完整')
        elif password != password2:
            flash('密码不一致')
        else:
            return 'success'
    return render_template('login.html')

flask_sqlalchemy(数据库相关)

常用字段类型

常用列选项

常用关系选项

数据库基本操作

db.create_all() #创建数据库

db.drop_all() # 删除数据库

# 从文件导入db
>>> from app import db
# 创建所有数据表
>>> db.create_all()
# 导入所有
>>> from app import *
# 创建一个名叫 admin 
>>> role = Role(name='admin')
# 添加 名叫 admin 的role
>>> db.session.add(role)
# 提交到数据库 
>>> db.session.commit()
# 创建 User 添加name、role_id属性
>>> user = User(name='wsj',role_id=role.id)
# 添加
>>> db.session.add(user)
# 提交到数据库
>>> db.session.commit()
# 修改name属性为programmer
>>> user.name = 'programmer'
# 提交到数据库
>>> db.session.commit()
# 删除user
>>> db.session.delete(user)
# 提交到数据库
>>> db.session.commit()

模型之间的关联

一对多

class Role(db.Model):
    # 定义表名
    __tablename__ = 'roles'
    # 定义字段
    # db.Column表示是一个字段
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(16),unique=True)
    # 关联
    # 表示和User模型发生了关联,增加了一个Users属性(不会在字段中出现)
    # backref 表示role是User要用的属性
    users = db.relationship('User',backref='role')

查询操作

常用的查询过滤器

常用查询执行器

查询示例:

发表回复