Flask介紹:html
Flask是一個基於Python開發而且依賴jinja2模板和Werkzeug WSGI服務的一個微型框架,對於Werkzeug本質是Socket服務端,其用於接收http請求並對請求進行預處理,而後觸發Flask框架,開發人員基於Flask框架提供的功能對請求進行相應的處理,並返回給用戶,若是要返回給用戶複雜的內容時,須要藉助jinja2模板來實現對模板的處理,即:將模板和數據進行渲染,將渲染後的字符串返回給用戶瀏覽器。python
大白話說就是:短小精悍,輕量mysql
和django對比:sql
django:無socket,依賴第三方模塊wsgi,中間件,路由系統(CBV,FBV),視圖函數,ORM。cookie,session,Admin,Form,緩存,信號,序列化。。 Flask: 無socket,中間件(擴展),路由系統,視圖(CBV)、第三方模塊(依賴jinja2),cookie,session弱爆了
大白話說就是:這個框架和django比起來幾乎就是什麼都沒有,只須要簡單的引用就能夠了,想要插件引用就能夠了!可是這也是Flask的缺點,由於遇到任何複雜的業務都須要引用第三方模塊,致使Flask比django不穩定一些,開發大型項目也不推薦用Flask,由於當第三方插件用多了以後就更加不容易後期的維護了!django
使用:json
pip3 install flask
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run()
實例化Flask對象,裏面是有參數的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)
請求響應相關cookie
- 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://user@localhost/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目錄 配置文件
1、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'])
其它內容往後補充......
2、視圖函數
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)
2、請求與相應
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
往後總結......