1. 程式人生 > >Flask框架總結

Flask框架總結

Flask介紹:

Flask是一個基於Python開發並且依賴jinja2模板和Werkzeug WSGI服務的一個微型框架,對於Werkzeug本質是Socket服務端,其用於接收http請求並對請求進行預處理,然後觸發Flask框架,開發人員基於Flask框架提供的功能對請求進行相應的處理,並返回給使用者,如果要返回給使用者複雜的內容時,需要藉助jinja2模板來實現對模板的處理,即:將模板和資料進行渲染,將渲染後的字串返回給使用者瀏覽器。

大白話說就是:短小精悍,輕量

和django對比:

django:無socket,依賴第三方模組wsgi,中介軟體,路由系統(CBV,FBV),檢視函式,ORM。cookie,session,Admin,Form,快取,訊號,序列化。。
 Flask: 無socket,中介軟體(擴充套件),路由系統,檢視(CBV)、第三方模組(依賴jinja2),cookie,session弱爆了

大白話說就是:這個框架和django比起來幾乎就是什麼都沒有,只需要簡單的引用就可以了,想要外掛引用就可以了!但是這也是Flask的缺點,因為遇到任何複雜的業務都需要引用第三方模組,導致Flask比django不穩定一些,開發大型專案也不推薦用Flask,因為當第三方外掛用多了之後就更加不容易後期的維護了!

使用:

pip3 install flask
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run()

  

例項化Flask物件,裡面是有引數的

app = Flask(__name__,template_folder='templates',static_url_path='/xxxxxx')

兩種新增路由的方式

方式一:
  @app.route('/xxxx')  # @decorator
  def index():
     return "Index"
方式二:
  def index():
     return "Index"
  app.add_url_rule('/xxx', "n1", index)  #n1是別名 

Flask中裝飾器應用

 

from flask import Flask,render_template,request,redirect,session
app = Flask(__name__)
app.secret_key = "sdsfdsgdfgdfgfh"

def wrapper(func):
    def inner(*args,**kwargs):
        if not session.get("user_info"):
            return redirect("/login")
        ret = func(*args,**kwargs)
        return ret
    return inner

@app.route("/login",methods=["GET","POST"])
def login():
    if request.method=="GET":
        return render_template("login.html")
    else:
        # print(request.values)   #這個裡面什麼都有,相當於body
        username = request.form.get("username")
        password = request.form.get("password")
        if username=="haiyan" and password=="123":
            session["user_info"] = username
            # session.pop("user_info")  #刪除session
            return redirect("/index")
        else:
            # return render_template("login.html",**{"msg":"使用者名稱或密碼錯誤"})
            return render_template("login.html",msg="使用者名稱或者密碼錯誤")

@app.route("/index",methods=["GET","POST"])
@wrapper
def index():
    # if not session.get("user_info"):
    #     return redirect("/login")
    return render_template("index.html")


if __name__ == '__main__':
    app.run(debug=True)

 

請求響應相關

 

- request
            - request.form   #POST請求
            - request.args   #GET請求  字典形式的
            - request.querystring  #GET請求,bytes形式的
        - response
            - return render_tempalte()
            - return redirect()
            - return ""
            v = make_response(返回值)  #吧返回的值包在了這個函式裡面
        - session
            - 存在瀏覽器上,並且是加密的
            - 依賴於:secret_key

 

flask配置檔案

 

flask中的配置檔案是一個flask.config.Config物件(繼承字典),預設配置為:
    {
        'DEBUG':                                get_debug_flag(default=False),  是否開啟Debug模式
        'TESTING':                              False,                          是否開啟測試模式
        'PROPAGATE_EXCEPTIONS':                 None,                          
        'PRESERVE_CONTEXT_ON_EXCEPTION':        None,
        'SECRET_KEY':                           None,
        'PERMANENT_SESSION_LIFETIME':           timedelta(days=31),
        'USE_X_SENDFILE':                       False,
        'LOGGER_NAME':                          None,
        'LOGGER_HANDLER_POLICY':               'always',
        'SERVER_NAME':                          None,
        'APPLICATION_ROOT':                     None,
        'SESSION_COOKIE_NAME':                  'session',
        'SESSION_COOKIE_DOMAIN':                None,
        'SESSION_COOKIE_PATH':                  None,
        'SESSION_COOKIE_HTTPONLY':              True,
        'SESSION_COOKIE_SECURE':                False,
        'SESSION_REFRESH_EACH_REQUEST':         True,
        'MAX_CONTENT_LENGTH':                   None,
        'SEND_FILE_MAX_AGE_DEFAULT':            timedelta(hours=12),
        'TRAP_BAD_REQUEST_ERRORS':              False,
        'TRAP_HTTP_EXCEPTIONS':                 False,
        'EXPLAIN_TEMPLATE_LOADING':             False,
        'PREFERRED_URL_SCHEME':                 'http',
        'JSON_AS_ASCII':                        True,
        'JSON_SORT_KEYS':                       True,
        'JSONIFY_PRETTYPRINT_REGULAR':          True,
        'JSONIFY_MIMETYPE':                     'application/json',
        'TEMPLATES_AUTO_RELOAD':                None,
    }
 
方式一:
    app.config['DEBUG'] = True
 
    PS: 由於Config物件本質上是字典,所以還可以使用app.config.update(...)
 
方式二:
    app.config.from_pyfile("python檔名稱")
        如:
            settings.py
                DEBUG = True
 
            app.config.from_pyfile("settings.py")
 
    app.config.from_envvar("環境變數名稱")
        環境變數的值為python檔名稱名稱,內部呼叫from_pyfile方法
 
 
    app.config.from_json("json檔名稱")
        JSON檔名稱,必須是json格式,因為內部會執行json.loads
 
    app.config.from_mapping({'DEBUG':True})
        字典格式
 
    app.config.from_object("python類或類的路徑")
 
        app.config.from_object('pro_flask.settings.TestingConfig')
 
        settings.py
 
            class Config(object):
                DEBUG = False
                TESTING = False
                DATABASE_URI = 'sqlite://:memory:'
 
            class ProductionConfig(Config):
                DATABASE_URI = 'mysql://[email protected]/foo'
 
            class DevelopmentConfig(Config):
                DEBUG = True
 
            class TestingConfig(Config):
                TESTING = True
 
        PS: 從sys.path中已經存在路徑開始寫
     
 
    PS: settings.py檔案預設路徑要放在程式root_path目錄,如果instance_relative_config為True,則就是instance_path目錄

配置檔案

 

一、Flask之路由

常用五種方式

@app.route('/user/<username>')   #常用的   不加引數的時候預設是字串形式的
@app.route('/post/<int:post_id>')  #常用的   #指定int,說明是整型的
@app.route('/post/<float:post_id>')
@app.route('/post/<path:path>')
@app.route('/login', methods=['GET', 'POST'])

其它內容日後補充......

 

二、檢視函式

CBV

def auth(func):
            def inner(*args, **kwargs):
                result = func(*args, **kwargs)
                return result
            return inner

        class IndexView(views.MethodView):
            # methods = ['POST']  #只允許POST請求訪問
            decorators = [auth,]  #如果想給所有的get,post請求加裝飾器,就可以這樣來寫,也可以單個指定
  
            def get(self):   #如果是get請求需要執行的程式碼
                v = url_for('index')
                print(v)
                return "GET"

            def post(self):  #如果是post請求執行的程式碼
                return "POST"

        app.add_url_rule('/index', view_func=IndexView.as_view(name='index'))  #name指定的是別名,會當做endpoint使用

        if __name__ == '__main__':
            app.run()

FBV

 

方式一:
    @app.route('/index',endpoint='xx')
    def index(nid):
        url_for('xx',nid=123)
        return "Index"

    方式二:
    def index(nid):
        url_for('xx',nid=123)
        return "Index"

    app.add_url_rule('/index',index)

 

  

二、請求與相應

 

from flask import Flask
    from flask import request
    from flask import render_template
    from flask import redirect
    from flask import make_response

    app = Flask(__name__)


    @app.route('/login.html', methods=['GET', "POST"])
    def login():

        # 請求相關資訊
        # request.method
        # request.args
        # request.form
        # request.values
        # request.cookies
        # request.headers
        # request.path
        # request.full_path
        # request.script_root
        # request.url
        # request.base_url
        # request.url_root
        # request.host_url
        # request.host
        # request.files
        # obj = request.files['the_file_name']
        # obj.save('/var/www/uploads/' + secure_filename(f.filename))

        # 響應相關資訊
        # return "字串"
        # return render_template('html模板路徑',**{})
        # return redirect('/index.html')

        # response = make_response(render_template('index.html'))
        # response是flask.wrappers.Response型別
        # response.delete_cookie('key')
        # response.set_cookie('key', 'value')
        # response.headers['X-Something'] = 'A value'
        # return response


        return "內容"

    if __name__ == '__main__':
        app.run()

  

其它基礎內容還有:

模板語法、session、blueprint藍圖、flash

日後總結......