flask(1):从hello World入门

一个简单的flask应用:

一:初始化 

from flask import Flask

app = Flask(__name__)

所有的flask程序都必须创建一个程序实例。上述代码中,app即为Flask类的一个实例。

web服务器,使用一种名为web服务器网关接口(web server gateway interface,WSGI)的协议,会将接收自客户端的所有请求,转交给这个对象来处理。

app.run() 运行

二:路由和视图函数

客户端将请求发送给web服务器后,服务器会再将请求发送给flask实例。

程序实例需要知道,每个URL要运行哪些代码,所以程序内部需要指定URL到函数的映射关系。

处理URL和函数之间关系的程序,称为路由。

上述程序中,使用app.route装饰器来注册路由。这是定义路由最简便的方式。

@app.route(path)

def function():

意为,当浏览器访问的路径为path时,执行function函数。例如,上述代码片段执行的结果是,当浏览器访问根目录时,执行helloWorld函数。

而helloWorld这样的函数,被称之为视图函数。

注意:URL可以包含可变字段,例如,针对不同用户,可以有不同的个人主页等。实现过程,除了在视图函数中增加对应参数之外,还需在装饰器中使用特殊语法。例如,对不同用户,生成对应的欢迎信息,代码修改如下:

 同时还可以对该动态部分做限定,比如数据类型等。支持的数据类型有string,int,float,path等。

三:请求和响应

负责浏览器和web服务器之间通信的协议叫做http协议。http消息用于交换服务器和客户端之间的数据。消息有两种类型:

客户端发送的请求

服务器返回的响应

1:请求

app.url_map可以查看flask程序中的URL映射。其中的HEAD,Options,GET是请求方法,是由对应路由进行处理的。

除了GET之外,还支持POST方法,GET用于请求数据,而POST用于提交数据。在路由中,可以指定methonds=['GET','POST']。

2:程序和请求上下文

在程序运行的过程中,需要让视图函数能够访问一些对象,以达到更好交互,完成特定功能。

如何处理这种场景呢?给视图函数添加参数?各种可能处理的已知属性都写定?各种可能处理的未知属性都用关键字参数占位?这样,未免冗余繁杂。

flask对于该场景的设计机制是,分别提供一种叫做程序上下文和请求上下文的东西。

上下文,在汉语中的意思是,语意,语境,一定长度的文字或内容。

而flask中的程序上下文或请求上下文,意义更为确定,是指:在一个请求(程序)中,特定属性被暂时当做全局变量,不用定义便可使用,请求(程序)结束,变量销毁。

举例:两个人同时访问网页,发起两个不同的请求,各自将信息保存到session中。如果这时,设定了session是全局变量,那么同时发起的两个请求,一定会有一个session被覆盖。而如果不设置为全局变量,代码中必然无尽的传递session。

而采用上下文之后,可以理解为,两个请求之间做了隔离,每个人的请求中,对应着自己单独的session,互不影响,并且在整个请求的生命周期内,都可以使用。

3:请求钩子

有时需要在处理请求之前或之后执行某部分代码,比如,在需要在数据库连接之前创建连接用户。

为避免在每个视图函数中使用重复的代码,flask提供了注册通用函数的功能,注册的函数可以在请求被分发到视图函数之前或之后调用。

请求钩子使用装饰器实现,flask支持一下四种钩子:

     before_first_request    在请求第一个请求前执行

    before_request    在每次请求前执行    如果在某修饰的函数中返回了一个响应,视图函数将不再被调用

    after_request    如果没有抛出错误,在每次请求后执行

    teardown_request    在每次请求后执行
 

4:响应

flask调用视图函数后,会将其返回值作为响应的内容。比如,上述示例代码中,return后即为返回的内容。

除了这些内容,响应中还有一个很重要的东西叫做状态码,例如,我们有时候访问页面看到的404或500.

以下是常见的状态码:

默认200,请求成功处理

2xx成功:200(请求成功处理)、204(请求成功处理但无资源返回)、206(请求部分内容成功,在请求报文实体首部中包含需要的资源)

3xx重定向:301(永久性重定向,表示访问资源已经更新了URI,通常在返回报文首部信息增加Location提示新的URI,如果访问的URI保存为书签,则会被更新为新的URI)

                    302(临时性重定向,表示此次访问资源被重定向到新的URI,并非永久,不更新书签)

                    304(资源不满足客户端请求条件,比如请求的是某时间点后有更新则返回新资源,但资源在该时间点后无更新,被规在3xx,但和重定向没啥关系)

4xx客户端错误:400(客户端请求存在错误,应该修改请求后再次发送)、401(未授权)、403(禁止访问)、404(找不到访问的资源)

 5xx服务器错误:500(服务器处理请求时出现错误)、503(服务器忙碌或者停机维护无法处理请求)

除了直接return一些HTML标签之外,还有其他的响应方式。

render_template:渲染并返回一个html文件

redirect:重定向到一个URL

abort:错误处理
 

猜你喜欢

转载自blog.csdn.net/Daisy_zye/article/details/83421700