一、路由请求和参数处理
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# 1.导入Flask扩展
from flask import Flask
# 2.创建Flask应用程序实例
# 需要传入__name__,作用是为了确定资源所在的路径
app = Flask(__name__)
# 3.定义路由及视图函数
# Flask中定义路由是通过装饰器实现的
# 路由默认只支持GET,如果需要增加,需要自行指定
@app.route('/', methods = ['get', 'post'])
def index():
return 'Hello World'
# 使用同一个视图函数来显示不同用户的订单信息
# <>定义路由参数,<>内需要起个名字
@app.route('/orders/<int:order_id>')
def get_order_id(order_id):
# 参数类型,默认是字符串,<class str>
print(type(order_id))
# 有的时候,需要对路由做访问优化,订单ID应该是int类型
# 需要在视图函数的()内填入参数名,那么的代码才能去使用
return 'order_id %s' % order_id
# 4.启动程序
if __name__ == '__main__':
# 执行了app.run,就会将Flask程序运行在一个简易的服务器(Flask提供的,用于测试)
app.run()
二、模板、变量代码块、控制代码块和过滤器
1、py文件
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
from flask import Flask
from flask import render_template
app = Flask(__name__)
# 1.如何返回一个网页(模板)
# 2.如何给模板填充数据
@app.route('/')
def index():
# 比如需要传入网址
url_str = 'www.itheima.com'
my_list = [1,3,5,7,9]
my_dict = {
"name": "沐阳陈",
"url": "www.baidu.com",
}
my_int = 38
# 通常,模板中使用的变量名和要传递的数据变量名保持一致
return render_template('index.html',
url_str=url_str,
my_list=my_list,
my_dict=my_dict,
my_int=my_int,
)
if __name__ == '__main__':
app.run()
2、html文件
<html>
<head>
</head>
<body>
这是模板<br>
这是首页<br>
{#变量代码块#}
{{url_str}} <br> {#字符串#}
{#列表的使用#}
{{my_list}} <br>{#列表#}
{{my_list.2}} <br>{#列表的第二个元素#}
{{my_list[3]}} <br>{#列表的第二个元素#}
{#字典的使用#}
{{my_dict}} <br>
{{my_dict.url}} <br>
{{my_dict['name']}} <br>
{{my_int}} <br>
<hr>
{#控制代码块 {% %} #}
{#for循环的使用,建议先写for,然后按住tab进行补全#}
{% for num in my_list %}
{#数据大于3才能显示#}
{% if num > 3 %}
{{num}} <br>
{% endif %}
{% endfor %}
<hr>
{# 过滤器 #}
{# 字符串变大写 #}
{{url_str | upper}} <br>
{#字符串反转#}
{{url_str | reverse}} <br>
{#过滤器链式调用#}
{{url_str | reverse | upper}} <br>
</body>
</html>
三、普通表单验证和WTF插件
1.py文件
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
from flask import Flask, render_template, request, flash
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, EqualTo
APP = Flask(__name__)
APP.secret_key = 'muYangChen'
'''
目的:实现一个简单的登录逻辑处理
1.路由需要有get和post两种请求方式 --> 需要判断请求方式
2.获取请求参数
3.判断参数是否填写 & 密码是否相同
4.如果判断都没有问题,就返回一个success
'''
'''
给模板传递消息
flash --> 需要对内容加密,因此需要设置secret_key,做加密消息混淆
模板中需要便利消息
'''
'''
使用WTF实现表单
自定义表单类
'''
class LoginForm(FlaskForm):
'''
pass
'''
username = StringField(u'用户名:', validators=[DataRequired()])
password = PasswordField(u'密码:', validators=[DataRequired()])
password2 = PasswordField(u'确认密码:', validators=[DataRequired(),
EqualTo('password',
'密码输入的不一致')])
submit = SubmitField(u'提交')
@APP.route('/form', methods=['GET', 'POST'])
def login():
'''
pass
'''
login_form = LoginForm()
# 1.需要判断请求方式
if request.method == 'POST':
# 2.获取请求参数
username = request.form.get('username')
password = request.form.get('password')
password2 = request.form.get('password2')
# 3.验证参数,WTF可以一句话实现所有的校验
# 我们没有CSRF token
if login_form.validate_on_submit():
return 'success'
else:
flash('参数有误')
return render_template('index.html', login_form=login_form)
@APP.route('/', methods=['GET', 'POST'])
def index():
"""
pass
"""
# request: 请求对象 --> 可以获取请求方式,数据
# 需要判断请求方式
if request.method == 'POST':
# 2.获取请求参数
username = request.form.get('username')
password = request.form.get('password')
password2 = request.form.get('password2')
print(username, password, password2)
# 3.判断参数是否填写 & 密码是否相同
if not all([username, password, password2]):
# print(u'参数不完整')
flash(u'参数不完整')
elif password != password2:
# print(u'密码不一致')
flash(u'密码不一致')
elif len(password) < 6:
# print(u'密码太短')
flash(u'密码太短')
else:
return 'success'
return render_template('index.html')
if __name__ == '__main__':
APP.run(debug=True)
2.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<form method="post">
<label>用户名:</label><input type="text" name="username"><br>
<label>密码:</label><input type="password" name="password"><br>
<label>确认密码:</label><input type="password" name="password2"><br>
<input type="submit" value="提交"><br>
{#使用遍历获取闪现的消息#}
{% for message in get_flashed_messages() %}
{{message}}
{% endfor %}
</form>
<hr>
<form method="post">
{{login_form.csrf_token}}
{{login_form.username.label }}{{login_form.username}} <br>
{{login_form.password.label }}{{login_form.password}} <br>
{{login_form.password2.label }}{{login_form.password2}} <br>
{{login_form.submit}} <br>
</form>
</body>
</html>
四、数据库操作
1.db.Column 中其余的参数指定属性的配置选项
选项名 | 说 明 |
---|---|
primary_key | 如果设为 True,这列就是表的主键 |
unique | 如果设为 True,这列不允许出现重复的值 |
index | 如果设为 True,为这列创建索引,提升查询效率 |
nullable | 如果设为 True,这列允许使用空值;如果设为 False,这列不允许使用空值 |
default | 为这列定义默认值 |