1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
现在我们开发了一个简单的Flask小程序,知道用户在浏览器中输入一个URL对应到哪个视图函数进行处理。那么问题来了,怎么去进行处理一些比较复杂的业务逻辑呢?
 
一、程序上下文
1 、整个app范围,也就是说是全局的(程序级别)的上下文
怎么理解这个上下文呢?就是在所有的这个请求当中,我们共享的是同一块内存
#coding:utf-8
from  flask  import  Flask, session, request
app  =  Flask(__name__)
 
@app .route( "/" )
def  index():
     '''首页'''
     user  =  session.get( "user" , None )
     # 如果用户已经登录,此处打印用户消息
     print ( "user in index: %s" %  user
     return  "Hello World!"
 
@app .route( "/login/<user>/" )
def  login(user):
     '''模拟登录'''
     session[ "user" =  user
     # 将用户信息存入到session
     print ( "login user: %s" %  user
     return  "login success"
 
@app .route( "/logout/" )
def  logout():
     '''模拟登出'''
     user  =  session[ "user" ]
     print ( "logout user:%s" %  user
     # 将用户信息从session删除
     session[ "user" =  None
     return  "logout success"
 
#使用session必须要设置改key,随机的字符串即可
app.secret_key  =  "A0Z98/dfDER747#O%^!/,<87UHRHF"
 
if  __name__  = =  "__main__" :
     app.run(debug = True ,host = "0.0.0.0" )
 
 
2 、请求上下文
#coding:utf-8
from  flask  import  Flask, request
app  =  Flask(__name__)
 
@app .route( "/" )
def  index():
     #打印请求来源信息
     agent  =  request.headers.get( "User-Agent" , None )
     return  "From:%s"  %  agent
 
@app .route( "/head" )
def  head():
     headers  =  request.headers
     response  =  ""
     for  k, v  in  headers.items():
         response  + =  "%s: %s</br>"  %  (k,v)
     return  response
 
if  __name__   = =  "__main__" :
     app.run(debug = True ,host = "0.0.0.0" )
 
 
二、请求的调度(就是去限制一些请求)
#coding:utf-8
from  flask  import  Flask, request
app  =  Flask(__name__)
 
@app .route( "/" , methods = [ 'POST' ])  #只能post方式访问
def  index():
     #打印headers信息
     agent  =  request.headers.get( 'User-Agent' , None )
     return  "From: %s"  %  agent
 
@app .route( "/data/" , methods = [ 'GET' , 'POST' , 'HEAD' , 'OPTIONS' ])
def  data():
     '''
     处理不同类型的请求
     curl -i -X POST "http:/127.0.0.1:5000/data/"
     curl -i -X GET "http:/127.0.0.1:5000/data/"
     curl -i -X OPTIONS "http:/127.0.0.1:5000/data/"
     '''
     #处理post请求
     if  request.method  = =  "POST" :
         return  "From Post"
     elif  request.method  = =  "GET" :
         return  "From GET"
     return  "From other"
if  __name__   = =  "__main__" :
     # print(app.url_map)
     app.run(debug = True ,host = "0.0.0.0" )
     
 
三、请求之前做一些事情,请求完之后做一些事情
#coding:utf-8
from  flask  import  Flask, session, request
app  =  Flask(__name__)
 
@app .route( "/" )
def  index():
     '''首页'''
     user  =  session.get( "user" , None )
     # 如果用户已经登录,此处打印用户消息
     print ( "user in index: %s" %  user
     return  "Hello World!"
 
@app .route( "/login/<user>/" )
def  login(user):
     '''模拟登录'''
     session[ "user" =  user
     # 将用户信息存入到session
     print ( "login user: %s" %  user
     return  "login success"
 
@app .route( "/logout/" )
def  logout():
     '''模拟登出'''
     user  =  session[ "user" ]
     print ( "logout user:%s" %  user
     # 将用户信息从session删除
     session[ "user" =  None
     return  "logout success"
 
@app .route( "/error/" )
def  get_error():
     '''触发异常'''
     raise
 
@app .before_request
def  beforce_request():
     '''在每个请求之前执行'''
     print ( ">>>>>>>>>>>starting..." )
     
@app .after_request
def  after_request(response):
     '''如果没有未处理的异常抛出,在每次请求之后运行'''
     print ( ">>>>>>>>>>>ending..." )
     return  response
 
@app .teardown_request
def  teardown_request(exception):
     '''即使有未处理的异常抛出,也在每次请求之后运行'''
     print ( "#############teardown###############" )    
     
#使用session必须要设置改key,随机的字符串即可
app.secret_key  =  "A0Z98/dfDER747#O%^!/,<87UHRHF"
 
if  __name__  = =  "__main__" :
     app.run(debug = True ,host = "0.0.0.0" )
     
     
 
五、请求的响应
#coding:utf-8
from  flask  import  Flask, request,make_response, redirect, url_for, abort
app  =  Flask(__name__)
 
@app .route( '/' )
def  index():
     #打印请求来源信息
     return  "<h1>Bad Request</h1>" 400
 
@app .route( "/test/" )
def  test():
     """在response中设置其他值"""
     # 打印headers信息
     response  =  make_response( "<h1>this document carries a cookie!</h1>" )
     # 设置一个cookie
     response.set_cookie( 'answer' , 'right' )
     return  response
     
@app .route( "/go/" )
def  go_where():
     """重定向"""
     #重定向到百度
     # return redirect("http://www.baidu.com")
     #重定向到test页面
     return  redirect(url_for( "test" ))
     
@app .route( "/down/" )
def  down():
     """直接返回状态码"""
     # abort(404)
     abort( 500 )
     
if  __name__  = =  "__main__" :
     app.run(debug = True ,host = "0.0.0.0" )