Flask是一個微型的小而精的Web框架,可擴展性強,內置的組件不多,須要引入第三方組件實現功能業 務,若是開發簡單的項目,使用Flask比較快速和方便。若是開發大型項目,須要引入大量的第三方組件,這時Flask會愈來愈像Django框架。基於wsgi協議部署,使用werkzeug模塊實現此協議,模板系統由 Jinja2提供。html
「微」(micro) 並不表示你須要把整個 Web 應用塞進單個 Python 文件(雖然確實能夠 ),也不意味着 Flask 在功能上有所欠缺。微框架中的「微」意味着 Flask 旨在保持核心簡單而易於擴展。Flask 不會替你作出太多決策——好比使用何種數據庫。而那些 Flask 所選擇的——好比使用何種模板引擎——則很容易替換。除此以外的一切都由可由你掌握。如此,Flask 能夠與您珠聯璧合。前端
默認狀況下,Flask 不包含數據庫抽象層、表單驗證,或是其它任何已有多種庫能夠勝任的功能。然而,Flask 支持用擴展來給應用添加這些功能,如同是 Flask 自己實現的同樣。衆多的擴展提供了數據庫集成、表單驗證、上傳處理、各類各樣的開放認證技術等功能。Flask 也許是「微小」的,但它已準備好在需求繁雜的生產環境中投入使用。python
from flask import Flask app = Flask(__name__) app.run()
僅僅須要三行代碼就能夠啓動一個flask服務,對於Django,是徹底不能作到的。數據庫
from flask import Flask app = Flask(__name__) @app.route("/home") def func(): return "hello world" app.run()
# app.route("/home")的源碼分析 class Flask(_PackageBoundObject): def route(self, rule, **options): def decorator(f): endpoint = options.pop("endpoint", None) self.add_url_rule(rule, endpoint, f, **options) return f return decorator
經過看flask中route的源碼瞭解到上面的例子還能夠這樣寫django
from flask import Flask app = Flask(__name__) def func(): return "hello world" # 在flask源碼中調用的就是add_url_rule方法,並把url和函數名傳進去 app.add_url_rule("/home", view_func=func) app.run()
from flask import Flask, request app = Flask(__name__) @app.route("/home", methods=("GET", "POST")) def func(): if request.method == "GET": return "GET請求" if request.method == "POST": return "POST請求" app.run()
request 與 Django 的不太同樣,經過導入的方式使用
from flask import request
json
from flask import Flask, request, render_template, redirect, Markup app = Flask(__name__) @app.route("/home", methods=("GET", "POST")) def func(): if request.method == "GET": return render_template( "./home.html", msg=Markup("<i>我是參數,Markup的做用是不讓瀏覽器轉義</i>")) //響應html頁面 if request.method == "POST": return redirect("/index") //響應重定向 @app.route("/index") def index(): return "我是index界面的內容" //響應字符串 app.run()
home.htmlflask
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>我是POST請求</h1> <h3>我是參數:<br> {{ msg }}</h3> <form action="" method="post"> 用戶:<input type="text" name="username"> <input type="submit" value="點我提交"> </form> </body> </html>
_dict_
與dir()的區別:_dict_
僅存儲與該實例相關的實例屬性_dict_
屬性僅僅是那個實例的實例屬性的集合,並不包含該實例的全部有效屬性。因此若是想獲取一個對象全部有效屬性,應使用dir()。_dict_
中的屬性。_dict_
是dir()的子集,dir()包含_dict_
中的屬性。_dict_
()或者dir()方法,咱們能夠獲得request對象及其父類中的全部屬性request-----> ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_cached_json', '_get_data_for_json', '_get_file_stream', '_get_stream_for_parsing', '_load_form_data', '_parse_content_type', 'accept_charsets', 'accept_encodings', 'accept_languages', 'accept_mimetypes', 'access_route', 'application', 'args', 'authorization', 'base_url', 'blueprint', 'cache_control', 'charset', 'close', 'content_encoding', 'content_length', 'content_md5', 'content_type', 'cookies', 'data', 'date', 'dict_storage_class', 'disable_data_descriptor', 'encoding_errors', 'endpoint', 'environ', 'files', 'form', 'form_data_parser_class', 'from_values', 'full_path', 'get_data', 'get_json', 'headers', 'host', 'host_url', 'if_match', 'if_modified_since', 'if_none_match', 'if_range', 'if_unmodified_since', 'input_stream', 'is_json', 'is_multiprocess', 'is_multithread', 'is_run_once', 'is_secure', 'is_xhr', 'json', 'list_storage_class', 'make_form_data_parser', 'max_content_length', 'max_form_memory_size', 'max_forwards', 'method', 'mimetype', 'mimetype_params', 'on_json_loading_failed', 'parameter_storage_class', 'path', 'pragma', 'query_string', 'range', 'referrer', 'remote_addr', 'remote_user', 'routing_exception', 'scheme', 'script_root', 'shallow', 'stream', 'trusted_hosts', 'url', 'url_charset', 'url_root', 'url_rule', 'user_agent', 'values', 'view_args', 'want_form_data_parsed']
這麼多的屬性難道咱們都須要記住嗎???固然不,挑挑重要的吧!
request.path // route("/home")
request.url // 全url("http://127.0.0.1:5000/home")
request.data //request解不了的數據全放這裏
request.json //傳過來的數據是application/json時放在這裏
request.form //form表單傳過來的數據
request.args //獲取url上的參數
request.values //request.form和request.args的數據組,經常使用於測試
swift
jinjia2與 Django 的template 極爲類似,語法更貼切Python,學起來很簡單後端
@app.template_global() def add_sum(*args): return sum(args) @app.route("/home") def home(): return render_template("./home.html") @app.route("/index") def index(): return render_template("./index.html") # 有了加了@app.template_global()裝飾器的函數就至關於給home和index函數的render_template傳了一個關鍵字傳參add_sum=add_sum, # 若是在app中就至關於 它給全部的視圖(包括藍圖中的藍圖)都加了add_sum=add_sum # 若是是在藍圖中,就至關於給當前的藍圖的全部視圖加 add_sum=add_sum # 藍圖的概念在後面的博客會介紹
@app.template_filter() def even(sum,zcy): """sum是'|'符號前傳過來的值,zcy是':'符號後面傳過來的值 """ if not sum % 2: return "偶數" else: return "奇數" print(zcy)
前端使用示例:瀏覽器
<p>{{ add_sum(23,6,1234,523,567,34136,132,6,25) | even:'就想告訴你還能夠給過濾器傳參數' }}</p>
jianja2的使用和django的template的相關使用同樣,不累述
{% macro create_tag(na,ty) %} <input type="{{ ty }}" name="{{ na }}" value="{{ na }}"> {% endmacro %} <h1>你往下看</h1> {{ create_tag("pppssssss","submit") }}
flask中的session 是存放在 瀏覽器cookies中的session ,session值是加密序列化的字符串
Flask使用Session時一樣須要導入
from flask import session
當使用session存儲數據時若是報如下錯誤,在實例化Flask後設置祕鑰便可
app.secret_key = "加密字符串"
就OK了!!!
session取值
session["key"] = value