Flask框架
Flask框架是python的web框架,其特点是轻便。
我们如果将搭建web视为建房子,让我们自己从头开始买建材、打地基、盖房子是一件需要耗费很多时间和精力的事情。Flask框架就相当于一间毛坯房,我们只需要根据自己的需要对web进行内部装修即可。
1.Flask基础
为了使用Flask框架,我们需要在终端执行以下代码为虚拟环境中安装第三方库flask。
pip install flask
以下是一个基础的Flask框架,
from flask import Flask # 导入Flask库
app = Flask(__name__) # 实例化一个Flask对象
@app.route('/') # 将视图函数暴露出去,暴露的路径为“/”
def hello_world(): # 定义一个视图函数
return '<b>Hello World!</b>' # 视图函数在页面的html代码
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=8080) # 以Debug模式,端口号为8080,允许任意主机访问的方式启动实例
2.命令行启动
如果我们需要实现在终端上使用命令行来启动实例化后的Flask对象,需要在终端执行以下代码为虚拟环境中安装第三方库flask-script。
pip install flask-script
之后我们需要写一个入口文件,
from flask_script import Manager # 导入第三方库
from app import app # 从实例所在的文件中导入Flask实例化的对象app
manager = Manager(app) # 建立一个实例,将app传递过来,通过manager来管理app
if __name__ == '__main__':
manager.run() # 启动实例
这样我们就可以在终端中使用以下命令行来启动实例对象app了,
python manage.py runserver -d -r -p 5005 -h 0.0.0.0 --threaded
# -d 为以Debug模式启动
# -r 指自动加载
# -p 为指定端口号
# -h 为指定主机访问
# --threaded 多线程
3.指定路由
指定路由是指将视图函数暴露出去。例如,
@app.route('/article/') # 访问路径为“/article/”
def article():
return '<h3>文章列表</h3>' # 视图函数的内容
@app.route('/article/<int:num>') # <int:num>指只能接收整数值,即,访问路径为“/article/任意整数值”
def article_detail(num):
return '<h2>你现在正在阅读第{}篇文章</h2>'.format(num) # 格式化
4.重定向
我们在浏览网页时经常会遇到进入新网站自动跳转到登录页面的情况,这其实就是网站使用了重定向的方法,使新用户或者未登陆的老用户跳转到登录或注册界面。
要实现重定向,我们需要用到redirect()和url_for()函数,同时,我们也会介绍以下导入网页文件的render_template()函数。
首先,我们需要写两个html文件,一个是简单的首页展示文件index.html,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<p><b>登陆成功</b></p>
</body>
</html>
另一个是登录界面login.html,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登陆页面</title>
</head>
<body>
<p>用户名:<input type="text"></p>
<p>密码:<input type="password"></p>
<p><input type="submit" value="登录"></p>
</body>
</html>
我们在app.py中将首页和登录页面使用render_template()暴露出去,render_template()函数可以直接将写好的html文件暴露出去。
@app.route('/')
def hello_world():
username = request.args.get('username') # 获取GET请求传递的username参数
password = request.args.get('password') # 获取GET请求传递的password参数
if username and password: # 如果username和password有值
return render_template('index.html') # 参数为暴露出去的页面
else:
return redirect(url_for('login')) # url_for函数会获取指定的函数的url地址,这里我们会获取到login函数的url地址,即“/s/”,redirect会将页面导向指定的url地址,即“/s/”
@app.route('/s/')
def login():
return render_template('login.html')
这时,如果我们直接登录主页,由于没有传递username和password的值,会直接跳转到“/s/”登陆页面。
那么如何传递参数呢?我们只需要在地址后添加以下内容即可传递相关参数,
?username=参数内容&password=参数内容
# ?参数1名称=参数内容&参数2名称=参数内容
# 如果有不止一个参数用&连接
5.限定请求方式
我们可以通过在route函数里添加methods参数来限定请求方式,methods参数为列表形式,列表中的所有方式为可以访问成功的方式,例如,
@app.route('/link/', methods=['GET', 'POST']) # 限定请求方式为‘GET’和‘POST’方式
def link():
if request.method == 'GET': # request.method返回访问的方式
return 'GET请求'
elif request.method == 'POST':
return 'POST请求'
else:
return '无效请求'
这时,我们在启动实例,该实例的“/link/”地址只能接收GET和POST请求,其它请求均会被拒绝。
下面我们简单说一下什么是GET请求和POST请求。
GET和POST是HTTP请求的两种基本方法,GET请求把参数包含在URL中,POST请求通过request body(即输入框等)传递参数。上面我们讲的传递username参数和password参数就是GET请求的方式,GET请求速度快,但是保密性差。
6.登录跳转
下面我们将之前的重定向进一步完善,
@app.route('/', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
return render_template('login.html')
else:
username = request.form.get('username') # 获取表单中的username
password = request.form.get('password') # 获取表单中的password
if username and password: # 如果username和password有值
return render_template('index.html') # 跳转首页
else:
return redirect(url_for('login')) # 否则继续返回登陆页面
同时,修改login.html文件,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登陆页面</title>
</head>
<body>
<form action="" method="post"> // 请求方式为POST
<p>用户名:<input type="text" name="username"></p> // name值为username
<p>密码:<input type="password" name="password"></p> // name值为password
<p><input type="submit" value="登录"></p>
</form>
</body>
</html>