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://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目錄
配置文件
一、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
日后總結......
