了解 flask 程序的基本结构,完成第一个 flask 程序的运行
所有的 flask 程序都需要一个实例程序,web 服务器使用了一种名为 web 服务器网关接口(WGSI)的协议,把接收客户端的请求都交给这个实例去处理
构造函数里面只有一个必须选用的参数的名字是主模块或者包的名字,一般情况下,__name__这个就是其所需要的值,其实就是为了查找其根目录,目的就是寻找根目录之下的资源文件的位置,以后会有更复杂的初始化方式
from flask import Flask
app=Flask(__name__)
路由和视图函数
首先客户端(比如浏览器)将请求发给服务器,服务器将请求发给 flask 实例之后就需要知道对那些 URL 请求哪些代码,这个时候就会有一个 URL 到 python 函数的一个映射关系程序,我们就该程序讲其称为路由
在 flask 程序中使用路由最简单的方法就是使用实例提供的 app.route 修饰器,把修饰的函数注册为路由
上面那个就是定义了根地址的处理程序,比如服务器的域名叫做 www.example.com,那么你访问 http://www.example.com 就会访问这个 index 方法,返回值就是响应,就如你搜索的时候看到的东西,像 index 这种函数我们就叫做视图函数,返回的值就是表单或者 html 代码
@app.route('/')
def index():
return '
Hello World!
'
就像之前的 Java Web 中的一样,镶嵌字符串会导致代码难以维护
就比如说一些动态的 URL,比如说你的个人登录的欢迎页面,这个时候也是可以用路由来进行定义的
之后任何能匹配到前面的静态地址都会访问这个函数,从而生成个人的欢迎页面,动态部分除了使用默认的字符串之外的话还有就是可以进行类型的定义,比如说 int,float,path(也是字符串,只不过把斜线不当做分隔符,当初字符串的一部分),只支持这三种
@app.route('/user/')
def index(name):
return '
Hello {0}!
'.format(name)
@app.route('/user/') 就会只匹配整数的动态 URL
启动服务器
这个__name__='__miain__'就表示只有这个脚本执行的时候才会去启动这个服务器,如果是其他脚本引入的,就不会执行这个
if __name__=='__main__':
app.run(debug=True)
会一直执行,一直到 ctrl+C 停止,debug=True 的作用就是可以重载程序或者是启用调试服务器
一个完整的程序
记得先要把虚拟环境激活以及安装好 flask 框架
虽然说 PyCharm 也可以进行 Git 的傻瓜式操作,暂时最好不要用那个,还是直接用 Git 命令比较好
运行 http://127.0.0.1:5000, 这个时候会显示 404,之后你再开始运行这个 py 文件之后就可以显示正常的画面了
看到上面那个图,每次的请求都会有一个响应,后来换成 ss 的时候就会重新启动一次,就相当于是一个请求响应的循环
from flask import Flask
app=Flask(__name__)
@app.route('/')
def index():
return '
Hello,World!
'
@app.route('/user/') #动态路由,这个 user 可以随便改的,并且不需要重新运行该 python 文件就可以直接用了
def user(name):
return '
Hello {0}
'.format(name)
if __name__=='__main__':
app.run(debug=True)
请求响应循环
现在就来介绍一下这个框架的设计概念
程序和请求的上下文
首先在客户端输入网址之后要想获得自己想要的结果就必须记得要把请求的对象(封装 http 请求的对象)传到视图函数中,如果使用参数的话就会让视图函数变得很杂乱无章,这就需要有一个上下文将其变为全局可以访问
表示是段落标签的意思,其实 request 不可能是一个全局变量,因为之后就会使用多线程服务器的时候一个线程去处理客户端发送的不同的请求,这个时候每个线程看到的 request 变量都会不一样,就需要说在一个线程当中这个上下文就需要全局可访问,这个时候就不会影响到其他的线程
from flask import request
@app.route('/')
def index():
user_agent=request.headers.get('User-Agent')
return '
Your Browser is {0}
'.format(user_agent)
这个之后就是一个线程池里面取出线程
Flask 有两种上下文:程序上下文以及请求上下文
使用这些变量的时候需要就是提前激活(推送)这些上下文,程序上下文被推送的时候就可以使用那两个变量,请求上下文被推送的时候就可以使用下面的两个变量,请求完成之后就可以将其删除,看下面就可以知道不推送的时候就会报错
请求调度
Flask 会用 app.route() 或者 app.add_url_rule() 来生成 URL 映射
第二个是 falsk 自己加的一个特殊的路由,用于访问静态的文件,那三个都是请求方法,当然这个都用的是 GET, 其他两个是由 flask 自己进行处理的
请求钩子
响应
就比如说这个时候就会显示 404,后面加个逗号继续就表示需要返回不同的响应码
@app.route('/404')
def FOF():
return '
Bad Request
',404
还有一种比较常用的响应就是重定向,一般都是用 302
@app.route('/')
def index():
response=make_response('
take a cookie
')
response.set_cookie('answer','42')
return response
并且这个重定向就是客户端的跳转,所以说里面的网址都会跳转
from flask import redirect
@app.route('/')
def index():
return redirect('http://www.baidu.com')
Flask 扩展
Flask 设计成可以扩展的形式,比如说数据库以及用户认证并没有提供这样的功能,社区人员开发了很多不同用途的扩展,如果还不能满足需求的话就可以用一些标准包以及一些代码库,下面就演示一个怎么将其扩展整合到程序中的实例
使用 Flask-Script 支持命令行选项
Flask web 服务器支持很多的启动设置的选项,但是只能在 app.run() 里面去设置才行,很不方便,其实最好的方式就应该是直接在命令行中去实现
Flask-Script 是一个 Flask 扩展,为 Flask 程序添加了一个命令行的解析器,可以用匹配 pip install flask-script
一定要记得更换这个解释器,不然的话就会你安装了一些东西之后发现不起作用
看的书上介绍是在 from flask.ext.script import Manager 里面,但是自己实际上去弄的时候是在 flask_script 里面的,专门为 Flask 扩展的都在 flask.ext 里面(但是自己实际上实现并不是这样)
from flask_script import Manager
manager=Manager(app)
if __name__=='__main__':
manager.run()
上面的那个扩展也适用于很多扩展,就是将程序实例弄进构造函数中,创建的对象就可以在各个扩展中进行使用,用 manager.run() 启动之后就可以开始解析命令行了
来源: http://www.bubuko.com/infodetail-2460419.html