Flask框架總結
阿新 • • 發佈:2018-11-23
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
日後總結......