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