第二章 應用的基本結構
---恢復內容開始---
2.1 初始化
from flask import Flask #從flask模組裡找到Flask類 app=Flask(__name__)
問題1:__name__是什麼? 答:__name__是一個模組的內建屬性,有兩種情況:
-
-
-
-
-
-
-
-
-
-
-
-
- 當檔案是Flask下的頂層檔案時(未被匯入),__name__自動變成__main__。
- 當檔案被被匯入時(變成下層檔案了),__name__變成使用者自己定的模組名。
-
-
-
-
-
-
-
-
-
-
-
問題2:app是否是一個Flask例項?答:應該是。一個類的例項,有一個引數(__name__),書上說是定位用的。
2.2路由和檢視函式
Flask(寫在後端上)會接受客戶端的請求,以URL的形式傳遞。 路由決定Flask裡那條指令對UR做出反應
@app.route('/')#路由器 def index():#檢視函式 return '<h1>你好你好</h1>'
問題1: @app.route('/') 裡的('/')是啥?
答:route('')裡的東西應該是path ,文中說日常URL有可變的部分,如https://i.cnblogs.com/EditPosts.aspx?opt=1,‘EditPosts.aspx?opt=1’就應該寫在()裡。這個讓我想到了家裡的路由器,網線先是一根匯流排,這是所有資料都要走的線,然後被路由器分成了獨立的4根分線。 那i.cnblogs.com應該就是匯流排,是伺服器的地址,然後在通過路由('/')裡的路徑去訪問分線。
問題2:index()是啥
答:文中說是檢視函式,讓他和路由裡的URL一一對應。
@app.route('/users/<name>')#路由器 def index(name):#檢視函式 return '<h1>{}你好你好</h1>'.format(name)
<name>是URL的動態部分改變name,檢視函式就會改變,裝飾器的<name>引數也匯入到index中去了
注意:def app.rout(匯入引數'/users/<name>')
def wrapperd(index):
index操作
return index
return wrapper
2.4 WEB開發伺服器
用的pycharm,新建flask專案自動搞定了
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__':#只有沒被匯入時候,才會執行run()函式 app.run()
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
問題:URL各部分是什麼意思?
答 http是協議 127.0.0.1是本地的ip地址,對應的域名是locolhost(,對的) : 5000是埠
2.6 除錯模式
debug模式:1 app.run(debug=True) 還可以新建一個config檔案,然後呼叫config.
2 也可以用socket自帶的config字典 書上沒有
2.8請求響應迴圈
流程:請求-分派-響應
from flask import Flask,request app = Flask(__name__) @app.route('/user/<name>') def user(name): return '<h1>{} 你好</h1>'.format(name) @app.route('/') def index(): user_agent=request.headers.get('User-Agent')#request裡面封裝了客戶端發來的HTTP請求, 用get()函式獲取request下(也就是http請求裡的header裡的內容) return '</p> 你的瀏覽器是{}'.format(user_agent)#get()引數是一個key,也就是說User-Agent是一個key,返回value即代理設定資訊 if __name__ == '__main__': app.run(debug=True)
響應:
@app.route('/bad') def index_2(): return '<h1>這個網頁失效了</h1>', 400 響應就是檢視函式的返回值。檢視函式返回三個三個值:1 響應文字 2 狀態碼預設是200,也可以設定 3 是由http響應首部組成的字典 都由,隔開
還可以返回一個響應物件:
from flask import make_response
@app.route('/bad_2') def index_3(): response=make_response('<h1>這是檔案載入了一個cookie!</h1>') response.set_cookie('answer','42') return response
#以下是獲取cookies 的方法要匯入request
@app.route('/get_cookies')
def get_cookies():
bb=request.cookies.get('answer')
return bb
make_response的引數也有三個,和檢視函式返回一致。但是make_response室友屬性和方法的。詳情見P18
問: set_cookie('answer','42') 是什麼?
答: set_cookie()是物件make_reponse下的一個函式,用來設定cookie cookie是以鍵值對呈現的,所以 set_cookie()的引數也應該是一對 穩重的鍵時answer 值是42
獲取的時候用 request.cookies.get('鍵')
問:為什麼設定cookie時候用response 獲取cookie時候要用request呢?
答:是否可以這樣理解:是否設定cookie,設定什麼cookie是伺服器給瀏覽器的響應資訊。讓瀏覽器儲存在本地。而讀取瀏覽器的函式要用request,請求。
重定向
from flask import redirect @app.route('/redirect') def redirec(): return redirect('localhost:5000/bad_2')
from flask import abort
@app.route('/<id>')
def get_user(id):
user=load_user(id) #哪來的呢????
if not user:
abort(404)
return '<h1>你好{}'.format(id)