1. 程式人生 > >第二章 應用的基本結構

第二章 應用的基本結構

---恢復內容開始---

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)