Flask应用开发
Flask是一个使用Python编写的轻量级Web应用框架。
Flask简介
Flask框架诞生于2010年,其作者为Armin Ronacher。本来这个项目只是作者在愚人节的一个恶作剧,后来该框架受到了广大开发者的喜爱,进而成为一个正式的项目。
第一个Flask Web程序
Flask是一个基于Python语言的微型Web框架。之所以被称为微型,是因为其核心非常小,但是该Web框架简约而不简单,具有很强的扩展能力。 在Flask中输出Hello World
# 从Flask框架中导入Flask类
from flask import Flask
# 传入__name__初始化一个Flask实例
app = Flask(__name__)
#这个路由将根URL映射到了hello_world函数上
@app.route('/')
def hello_world(): #定义视图函数
return 'Hello World!' #返回响应对象
if __name__ == '__main__':
#指定默认主机为是127.0.0.1,port为8888
app.run(debug=True,host='0.0.0.0', port=8888)
所有的Flask程序都必须创建一个程序实例。Web服务器使用一种名为Web服务器网关接口(Web Server Gateway Interface,WSGI)的协议,把接收自客户端的所有请求都转给这个对象进行处理。
- from flask import Flask这行代码表示从Flask框架中引入Flask对象。
app=Flask(__name__)
这行代码表示传入__name__这个变量值来初始化Flask对象,Flask用这个参数确定程序的根目录,__name__代表的是这个模块本身的名称。- 使用route()装饰器注明通过什么样的URL可以访问函数,同时在函数中返回要显示在浏览器中的信息。@app.route(‘/’)这行代码指定了URL与Python函数的映射关系,我们把处理URL和函数之间关系的程序定义为路由,把被装饰的函数index()注册为路由,此处注册给index()函数的路由为根目录。
- 系统初始化了,路由和视图函数有了,Flask程序如何运行呢?Flask程序的运行需要服务器环境,我们可以通过run方法来启动Flask自身集成的服务器。
- 如果
__name__=='__main__'
,就要启用Web服务来运行上面的程序,服务器一旦开启,就会进入轮询状态,等待并处理请求。在app.run()中可以传入一些参数,比如debug,app.run(debug=Ture),表示设置当前项目为debug模式,也就是调试模式。如果设置了调试模式,遇到程序有错误,会在控制台输出具体的错误信息,否则只会笼统地报告“应用服务器错误”的信息。另一方面,如果设置为调试模式,期间又修改了程序代码,系统会自动重新将修改的代码提交给Web服务器,你只需要确保浏览器没有缓存,便可以得到最新修改的代码结果。 - app.run()还可以传入端口等信息,比如app.run(host=’0.0.0.0’,port=8080),host=’0.0.0.0’参数设置启用本机的IP地址可以访问,端口地址指定为8080,如果不指定,则为5000。
URL传递参数
Flask中如果要传递一个变量或者一个参数,可以通过表单和地址栏两种方式来传递。其中,通过浏览器地址栏URL方式传递/获取某个变量或参数使用得比较多。这样,我们可以使用相同的URL指定不同的参数,来访问不同的内容。
Flask通过URL传递参数,传递参数的语法是:’/<参数名>/'。需要注意两点:参数需要放在一对<>(尖括号)内;视图函数中需要设置同URL中相同的参数名。参数名>
# 从Flask框架中导入Flask类
from flask import Flask
# 传入__name__初始化一个Flask实例
app = Flask(__name__)
#这个路由将根URL映射到了hello_world函数上
@app.route('/')
def hello_world(): #定义视图函数
return 'Hello World!' #返回响应对象
@app.route('/user/<name>') #定义路由,传递的参数名是name,因此
def hello_name(name): #需要在函数的形参中定义同名的参数
return "Hello World! %s" %name #返回值
if __name__ == '__main__':
#指定默认主机为是127.0.0.1,port为8888
app.run(debug=True,host='0.0.0.0', port=8888)
请求路径 http://localhost:8888/user/yjj
URL请求
- 需要导入request对象“from flask import request”,提交的请求的相关信息都在这个对象中了。
- 在route中指定视图函数的请求接收方式:指定参数如“methods=[‘GET’, ‘POST’]”,methods参数的值是一个列表,在其中指定需要的请求方式即可,若没有指定则默认是GET,如果接收到的是POST请求,但却没有指定,则会报错。
- get请求获取参数值:使用查询字符串的方式传递参数时,使用“request.args.get(‘param_name)’)”即可。
- post请求获取参数值:使用form表单传递参数时,使用“request.form.get(‘param_name’)”即可,这个“param_name”是HTML中form表单元素的name属性的值,当然也需要在form中指定提交请求的方式为post“method=”POST””(特别注意在视图函数的route中也要指明post请求方式)。
- 获取request请求方式:使用“request.method”即可,它的值为请求方式的全大写,比如“POST”。
URL反转
我们设定了一些函数访问URL。有时候,在作网页重定向或是模板文件时需要使用在视图函数中定义的URL,我们必须根据视图函数名称得到当前所指向的URL,这就是URL反转。下面通过一个实例来看URL反转的使用。
# 从Flask框架中导入Flask类
from flask import Flask,url_for
# 传入__name__初始化一个Flask实例
app = Flask(__name__)
#这个路由将根URL映射到了hello_world函数上
@app.route("/") #定义路由
def index(): #定义视图函数
url1=(url_for('hello_name', name='yjj')) #视图函数名为参数,进行反转
return "URL反转内容为:%s" % url1 #返回反转的内容
@app.route('/user/<name>') #定义路由,传递的参数名是name,因此
def hello_name(name): #需要在函数的形参中定义同名的参数
return "Hello World! %s" %name #返回值
if __name__ == '__main__':
#指定默认主机为是127.0.0.1,port为8888
app.run(debug=True,host='0.0.0.0', port=8888)
输出
URL反转内容为:/user/yjj
使用URL反转,用到了url_for()函数,需要使用from flask import url_for导入,url_for()函数最简单的用法是以视图函数名作为参数,返回对应的URL。
页面跳转和重定向
用户在访问某个页面的时候,我们希望他登录后才能访问该页面,如果此时他没有登录,系统就让浏览器由当前页面跳转到登录页面,这里就涉及页面重定向问题。所谓页面重定向,就是用户在打开某个页面的时候,我们期望页面跳转到另一个指定的页面,让用户完成某种操作或执行某个动作。
Flask中提供了重定向函数redirect(),该函数的功能就是跳转到指定的URL。
# 从Flask框架中导入Flask类
from flask import Flask,url_for,redirect
# 传入__name__初始化一个Flask实例
app = Flask(__name__)
#这个路由将根URL映射到了hello_world函数上
@app.route("/") #定义路由
def index(): #定义视图函数
url1=(url_for('user_login', name='yjj')) #视图函数名为参数,进行反转
return redirect(url1) #返回反转的内容
@app.route('/login/<name>') #定义路由,传递的参数名是name,因此
def user_login(name): #需要在函数的形参中定义同名的参数
return "login %s" %name #返回值
if __name__ == '__main__':
#指定默认主机为是127.0.0.1,port为8888
app.run(debug=True,host='0.0.0.0', port=8888)
重定向是将原本的URL重新定向成为一个新的URL,可以实现页面的跳转。Flask中使用到了redirect()函数,需要使用from flask import redirect将其导入才能使用。这里输入地址访问的首先应该是index()这个视图函数,但是index()这个视图函数直接跳转到了user_login视图上
Jinja 2模板引擎
模板实质上是一个静态的包含HTML语法的全部或片段的文本文件,也可包含由变量表示的动态部分。使用真实值替换网页模板中的变量,生成对应数据的HTML片段,这一过程称为渲染。Flask提供了Jinja 2模板引擎来渲染模板。