目录
一、requirements 文件
Python项目中必须包含一个requirements.txt 文件,用于记录所有依赖包及其精确的版本号,以便在新环境中进行部署操作。
在虚拟环境使用以下命令将当前虚拟环境中的依赖包以版本号生成至文件中:
pip freeze >requirements.txt
在终端输入此行命令(安装或升级包后,最好更新这个文件以保证虚拟环境中的依赖包)
然后将新生成的txt文件保存,复制粘贴在新文件中,再进行下面代码操作
pip install -r requirements.txt
此时系统会通过txt文件自动安装库
二、简单的flask程序
# conding utf-8
#1.导入Flask扩展
from flask import Flask ,render_template
#2.创建Flask应用程序实例
#需要传入__name__,作用是为了确定资源所在的路径
app = Flask(__name__)
#3.定义路由及视图函数
#Flask中定义路由是通过装饰器实现的
@app.route('/')
def hello_flask():
return "hello flask"
#4.启动程序
if __name__ == '__main__':
#执行了app.run()。就会将Flask程序运行在一个简易的服务器(Flask提供的,用于测试的)
app.run()
运行结果
三、路由请求方式限定
flask中定义路由是通过装饰器实现的
路由默认只支持GET,如果需要增加,需要自行指定
@app.route('/',methods= ['GET','POST'])
def index():
return 'hello,world'
即在route中加methods=['GET','POST']等需要加入的路由。
四、路由参数处理
有时我们需要将同一类URL映射到同一个视图函数处理,比如:使用同一个视图函数,来显示不同用户的订单。
#<>定义路由的参数,<>内需要起个名字
@app.route('/orders/<order_id>')
def get_order_id(order_id):
#需要在视图函数的()内填入参数名,那么后面的代码才能去使用
return 'order_id %s' % order_id
路由传递的参数默认当作string处理,str
有的时候,需要对路由做访问优化,订单ID应该是应该int类型
@app.route('/orders/<int:order_id>')
即在order前面加int:
这里指定Int,会调用系统的路由转换器进行匹配和转换
大致原理是将参数强转为int,如果成功,则可以进行路由匹配
如果参数无法转换成功,就无法匹配该路由
五、Jinja2模板引擎
模板
在前面的示例中,视图函数的主要作用是生成请求的响应,这是最简单的请求。实际上,视图函数有两个作用:处理业务逻辑和返回响应内容。在大型应用中,把业务逻辑和表现内容放在一起,会增加代码的复杂度和维护成本。本节学到的模板,它的作用即是承担视图函数的另一个作用,即返回响应内容。
·模板其实是一个包含响应文本的文件,其中用占位符(变量)表示动态部分,告诉模板引擎其具体的值需要从使用的数据中获取
·使用真实值替换变量,再返回最终得到的字符串,这个过程称为“渲染”·Flask是使用 Jinja2这个模板引擎来渲染模板
使用模板的好处:
·视图函数只负责业务逻辑和数据处理(业务逻辑方面)
·而模板则取到视图函数的数据结果进行展示(视图展示方面)·代码结构清晰,耦合度低
Jinja2 :是python下一个被广泛应用的模板引擎,是由python实现的模板语言,他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能,其是Flask内置的模板语言
模板语言:是一种被设计来自动生成文档的简单文本格式,在模板语言中,一般都会把一些变量传给模板,替换模板的特定位置上预先定义好的占位变量名
渲染模板函数
Flask提供的render_template函数封装了该模板引擎
render_template函数的第一个参数是模板的文件名,后面的参数都是键值对,表示模板中变量对应的真实值
比如需要传入网址
def index():
url_str = 'www.baidu.com'
return render_template('index.html', url_str= url_str)
注意:return 中的后一个url_str指上面一个url_str,前一个指html中命名的名字
通常,模板中使用的变量名和要传递的数据的变量名保持一致
使用方法
注释
使用{# # } 进行 注释
{# {{ name }} #}
变量代码块
{{}}来表示变量名,这种{{}}语法叫做变量代码块
{{url_str}}
Jinja2模板中的变量代码块可以是任意Python类型或对象,只要它能够被Python的str()方法转换为一个字符串就可以,比如,可以通过下面的方式显示一个字典或者列表中的某个元素:
{{your_dict['key']}}
{{your_list[0]}}
控制代码块
用{% %}定义的控制代码块,可以实现一些语言层次的功能,比如循环或者if语句
{% if user %}
{{ user }}
{% else %}
hello!
{% for index in indexs %}
{{ index }}
{% endfor %}
过滤器
过滤器的本质就是函数。有时候我们不仅仅只是需要输出变量的值,我们还需要修改变量的显示,甚至是格式化,运算等,而在模板中是不能直接调用Python中的某些方法,那么这就用到了过滤器
使用方法:
过滤器的使用方法为:变量名|过滤器
{{variable | filter_name(*args)}}
如果没有任何参数传给过滤器,则可以把括号省略掉
{{variable | filter_name}}
链式调用
在jinja2中,过滤器是可以支持链式调用的,示例如下:
{{"hello world" | reverse |upper}}
六、Web表单
web表单是web应用程序的基本功能。
它是HTML页面中负责数据采集的部件。表单有三个部分组成:表单标签、表单域、表单按钮。表单允许用户输入数据,负责HTML页面数据采集,通过表单将用户输入的数据提交给服务器。
在Flask中,为了处理web表单,美们一般使用Flask-WTF扩展,它封装了WTForms,并且它有验证表单数据的功能
示例
使用普通方式实现表单
在HTML页面中直接写form表单
<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>
实际代码
# conding utf-8
from flask import Flask,render_template,request
app = Flask(__name__)
'''
目的:实现一个简单的登录的逻辑处理
1.路由需要有get和post两种请求方式 --> 需要判断请求方式
2.获取请求的参数
3.判断参数是否填写 & 密码是否相同
4.如果判断都没有问题,就返回一个success
'''
@app.route('/',methods = ['GET','POST'])
def index():
# request :请求对象 --> 获取请求方式、数据
#1.判断请求方式
if request.method == 'POST':
#2.获取请求的参数
username = request.form.get('username')
password = request.form.get('password')
password2 = request.form.get('password2')
print(username)
#3.判断参数是否填写 & 密码是否相同
if not all([username,password,password2]):
print("参数不完整")
elif password != password2:
print("密码不一致")
else :
return 'success'
return render_template('text.html')
if __name__ == '__main__':
app.run()
注:此方法将参数不完整等消息传到控制台上,并不会在网页出现提示
改进后的代码:可以将提示显示到网页上
# conding utf-8
from flask import Flask,render_template,request,flash
app = Flask(__name__)
app.secret_key = 'GGbond'
'''
目的:实现一个简单的登录的逻辑处理
1.路由需要有get和post两种请求方式 --> 需要判断请求方式
2.获取请求的参数
3.判断参数是否填写 & 密码是否相同
4.如果判断都没有问题,就返回一个success
'''
'''
给模板传递消息:flash --> 需要对内容加密,因此需要设置secret_key,做加密消息的混淆
模板中需要遍历消息
'''
@app.route('/',methods = ['GET','POST'])
def index():
# request :请求对象 --> 获取请求方式、数据
#1.判断请求方式
if request.method == 'POST':
#2.获取请求的参数
username = request.form.get('username')
password = request.form.get('password')
password2 = request.form.get('password2')
print(username)
#3.判断参数是否填写 & 密码是否相同
if not all([username,password,password2]):
#print("参数不完整")
flash("参数不完整")
elif password != password2:
#print("密码不一致")
flash("密码不一致")
else :
return 'success'
return render_template('text.html')
if __name__ == '__main__':
app.run()
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>GG</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>
</body>
</html>
注意点:
1.使用flash时,需要对内容加密,因此需要设置secret_key ,做加密消息的混淆
即 app.secret_key = 'GGbond' 此行
2.get_flashed_messages()为一个函数,记得在输入的时候在最后加入()
七、使用Flask-WTF实现表单
Web表单
web表单是web应用程序的基本功能它是HTML页面中负责数据采集的部件。表单有三个部分组成: 表单标签、表单域、表单按钮。表单允许用户输入数据,负责HTML页面数据采集,通过表单将用户输入的数据提交给服务器。在Flask中,为了处理web表单,我们一般使用Flask-WTF扩展,它封装了WTForms,并且它有验证表单数冠的功能
先导入库
from flask_wtf import FlaskForm
from wtforms import StringField,PasswordField,SubmitField
使用WTF实现表单 自定义表单类
核心代码
class LoginForm(FlaskForm):
username = StringField("用户名:",validators =[DataRequired()])
password = PasswordField("密码:",validators =[DataRequired()])
password2 = PasswordField("确认密码:",validators =[DataRequired(),EqualTo('password',"前后密码填入不一致")])
submit = SubmitField("提交")
@app.route("/form",methods = ["GET","POST"])
def login():
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 所以需要在html中加入{{form.csrf_token()}}<br>
if login_form.validate_on_submit():
return "success"
else :
flash("参数有误")
return render_template('text.html',form = login_form)
<form method="post">
{{form.csrf_token()}}
{{form.username.label}}{{form.username}} <br>
{{form.password.label}}{{form.password}} <br>
{{form.password2.label}}{{form.password2}} <br>
{{form.submit}} <br>
</form>
注意点
1.验证参数,WTF可以一句话就实现所有的校验
2.我们没有CSRF token 所以需要在html中加入{{form.csrf_token()}}<br>