Flask—01-輕松入門Flask


Flask入門

WEB工作原理

  • C/S與B/S架構:客戶端-服務器,瀏覽器-服務器
  • B/S架構工作原理
    • 客戶端(瀏覽器) <=> WEB服務器(nginx) <=> WSGI(uWSGI) <=> Python(Flask) <=> 數據庫(MySQL)
    • 說明:flask自帶一個測試的WEB服務器,但是它僅僅適合於測試環境,不能用於生產環境。

MVC與MTV框架

  • MVC框架
    • M:Model,模型,即數據模型,負責數據的存取。
    • V:View,視圖,負責數據的展示效果。
    • C:Controller,控制器,負責業務邏輯的處理。
  • MTV框架
    • M:Model,模型,即數據模型,負責數據的存取。
    • T:Templates,模板,負責數據的展示效果。
    • V:View,視圖函數,負責業務邏輯的處理。
  • 總結:使用MVC或MTV就是為了解耦,可以提高開發維護的效率。

Flask框架簡介

  • 說明:

    flask是一個輕量級的web框架,被稱為微型框架。只提供了一個高效穩定的核心,其它全部通過擴展來實現。意思就是你可以根據項目需要進行量身定制,也意味着你需要不斷學習相關的擴展庫。

  • 核心:

    • WSGI系統、調試、路由
    • 模板引擎(Jinja2,是flask核心開發者人員開發的)
  • 安裝:pip install flask

啟動完整代碼

  • 完整代碼

    # 導入類庫
    from flask import Flask
    
    # 創建應用實例
    app = Flask(__name__)
    
    # 添加視圖函數
    @app.route('/')
    def index():
        return 'Hello Flask!'   
    
    # 啟動應用
    if __name__ == '__main__':
        app.run()
    
  • 啟動參數

    參數 說明
    debug 是否開啟調試模式,默認為False;開啟后會有出錯調試信息,文件會自動加載。
    threaded 是否開啟多線程,默認為Flase。
    host 指定主機,默認為'127.0.0.1',設置為'0.0.0.0'后可以通過IP進制訪問
    port 指定端口,默認為5000。

    啟動示例:app.run(debug=True, threaded=True, host=’0.0.0.0’, port=5555)

flask-script

  • 說明:

    簡單來說,該庫就是flask終端啟動的參數解析器;這樣就可以不更改代碼就能完成不同方式的啟動。

  • 安裝:pip install flask-script

  • 使用:

      # 導入類庫
      from flask_script import Manager
    
      # 創建對象
      manager = Manager(app)
    
      # 啟動應用
      if __name__ == '__main__':
          manager.run()
    
  • 啟動參數:

    參數 說明
    -?,--help 查看幫助
    -h,--host 指定主機
    -p,--port 主動端口
    -d,--debug 開啟調試模式
    -r,--reload 自動加載
    --threaded 開啟多線程
    --processes 指定多進程數量

    啟動示例:python manage.py runserver -d -r -h 0.0.0.0 -p 5555

flask使用

  • 視圖函數

    • 示例:
    # 無參路由
    @app.route('/')
    def index():
        return '<h1>Hello Flask!</h1>'
    
    # 帶參路由,可以傳遞多個參數
    @app.route('/welcome/<name>/<uid>/')
    def welcome(name, uid):
        return 'Hello {} {}'.format(name, uid)
    
    # 指定參數類型,如:str(默認)、int、float、path
    @app.route('/user/<int:uid>/')
    def user(uid):
        return 'Hello {}號'.format(uid)
    
    # path類型:類型仍然是str,只是將'/'當做普通字符處理而已
    @app.route('/path/<path:p>/')
    def path(p):
        return p
    
    • 說明:
    1.路由末尾的'/'建議都加上,防止出現路由多敲'/'出現的問題
    2.若需要路由參數,參數需要放在<>中,對應的視圖函數需要同名的參數
    3.路由參數可以指定多個,也可以指定類型
    4.常用參數類型:str(默認)、int、float、path,使用時放在參數前面,使用':'與參數連接
    5.path類型其實是str類型,只是將'/'作為普通字符處理罷了。
    
  • 請求(request)

    from flask import request
    
    # 請求,request中存放了所有的HTTP請求信息
    @app.route('/request/')
    def req():
        # 完整的路由地址
        # return request.url
        # 不包含GET參數的路由地址
        # return request.base_url
        # 只有協議主機和端口
        # return request.host_url
        # 只包含裝飾器中的路由地址
        # return request.path
        # 請求方法的類型:GET、POST
        # return request.method
        # 客戶端的IP
        # return request.remote_addr
        # args:GET參數;form:POST參數;values:GET和POST
        # return request.args.get('uid', '默認值')
        # headers:所有的請求頭信息
        return request.headers.get('User-Agent')
    
  • 響應(response)

    from flask import make_response
    
    # 響應response
    @app.route('/response/')
    def response():
        # 直接返回字符串
        # return 'OK'
        # 可以在返回時指定狀態碼,默認都是200
        # return 'page not found', 404
        # 先用專門的函數構造一個響應對象,可以指定內容及狀態碼等
        resp = make_response('這是通過函數構造的響應', 404)
        # 設置響應頭信息
        resp.headers['uid'] = 250
        return resp
    
  • 重定向(redirect)

    from flask import redirect, url_for
    
    # 重定向
    @app.route('/old/')
    def old():
        # return '原來的數據'
        # 通過url來重定向新的路由地址,參數是希望重定向的url
        # return redirect('/new/')
        # 根據視圖函數名反向構造路由地址,參數是視圖函數名
        # return url_for('new')
        return redirect(url_for('new'))
    
    @app.route('/new/')
    def new():
        return '新的數據'
    
  • 反向構造路由(url_for)

    # 反向構造路由
    @app.route('/urlfor/')
    def urlfor():
        # 不帶參數的路由
        # return url_for('new')
        # 可以構造帶參的路由,多出來的參數以GET形式傳遞
        # return url_for('user', uid=250, name='cuihua')
        # 構造完整(帶協議主機和端口)路由,可以進行外部跳轉
        return url_for('user', uid=250, name='cuihua', _external=True)
    
  • 終止及錯誤定制

    # 終止abort
    @app.route('/abort/')
    def err():
        # 終止代碼執行,其實是向系統拋出指定異常
        # 系統捕獲異常,按照統一的方案進行處理
        abort(404)
        return '正常'
    
    # 定制錯誤顯示
    @app.errorhandler(404)
    def page_not_found(e):
        return '是不是搞錯了大哥?'
    

藍本使用

  • 說明:

    當大量的視圖函數存放在一個文件中,很明顯是不合適的。最好是根據功能模塊進行划分,將相關的功能模塊放在同一文件,藍本就是用來解決這個問題的。

  • 使用:

    • user.py
    # 導入類庫
    from flask import Blueprint, url_for
    
    # 創建對象,可以指定統一的前綴
    user = Blueprint('user', __name__, url_prefix='/user')
    
    # 添加視圖函數
    @user.route('/login/')
    def login():
        # 當反向構造同一藍本中的路由時,藍本名可以省略,但是不能省略'.'
          return url_for('.register')
          return '歡迎登錄'
    
    @user.route('/register/')
    def register():
        return '歡迎注冊'
    
    • manage.py

      from user import user
      # 注冊藍本,注冊時可以再次設置相關參數,而且優先級較高,user:藍本名,url_prefix:路由
      app.register_blueprint(user, url_prefix='/u')
      
      @app.route('/urlfor/')
      def urlfor():
          # 構造藍本中的路由(藍本中的'/u')時,參數這樣傳遞:'藍本名.視圖函數名'
          return url_for('user.login')
      


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM