日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Flask从入门到放弃(介绍、模版语法案例、配置文件、路由本质、CBV整体流程)

發(fā)布時(shí)間:2023/12/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Flask从入门到放弃(介绍、模版语法案例、配置文件、路由本质、CBV整体流程) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 一、Flask介紹
  • 二、Flask快速使用
  • 三、Flask展示用戶信息案例
  • 四、Flask配置文件
  • 五、路由系統(tǒng)
    • 1)路由系統(tǒng)
    • 2)路由本質(zhì)
    • 3)Add_url_rule的參數(shù)
  • 六、Flask的CBV
    • 1)CBV的寫法
    • 2)CBV添加裝飾器
    • 3)as_view的執(zhí)行流程
    • 4)Login.as_view(name='index') name到底有什么用?
    • 5)CBV中得methods作用
  • 七、模板語(yǔ)法

一、Flask介紹

Flask是一個(gè)使用 Python 編寫的輕量級(jí) Web 應(yīng)用框架,其 WSGI 工具箱采用 Werkzeug ,模板引擎則使用 Jinja2 。對(duì)于Werkzeug本質(zhì)是Socket服務(wù)端,其用于接收http請(qǐng)求并對(duì)請(qǐng)求進(jìn)行預(yù)處理,然后觸發(fā)Flask框架,開發(fā)人員基于Flask框架提供的功能對(duì)請(qǐng)求進(jìn)行相應(yīng)的處理,并返回給用戶,如果要返回給用戶復(fù)雜的內(nèi)容時(shí),需要借助Jinja2模板來(lái)實(shí)現(xiàn)對(duì)模板的處理,即:將模板和數(shù)據(jù)進(jìn)行渲染,將渲染后的字符串返回給用戶瀏覽器。

“微”(micro) 并不表示你需要把整個(gè) Web 應(yīng)用塞進(jìn)單個(gè) Python 文件(雖然確實(shí)可以 ),也不意味著 Flask 在功能上有所欠缺。微框架中的“微”意味著 Flask 旨在保持核心簡(jiǎn)單而易于擴(kuò)展。Flask 不會(huì)替你做出太多決策——比如使用何種數(shù)據(jù)庫(kù)。而那些 Flask 所選擇的——比如使用何種模板引擎——?jiǎng)t很容易替換。除此之外的一切都由可由你掌握。如此,Flask 可以與您珠聯(lián)璧合。

默認(rèn)情況下,Flask 不包含數(shù)據(jù)庫(kù)抽象層、表單驗(yàn)證,或是其它任何已有多種庫(kù)可以勝任的功能。然而,Flask 支持用擴(kuò)展來(lái)給應(yīng)用添加這些功能,如同是 Flask 本身實(shí)現(xiàn)的一樣。眾多的擴(kuò)展提供了數(shù)據(jù)庫(kù)集成、表單驗(yàn)證、上傳處理、各種各樣的開放認(rèn)證技術(shù)等功能。Flask 也許是“微小”的,但它已準(zhǔn)備好在需求繁雜的生產(chǎn)環(huán)境中投入使用。

二、Flask快速使用

安裝Flask

pip install Flask

快速使用

from flask import Flaskapp = Flask(__name__) # 類實(shí)例得到一個(gè)對(duì)象@app.route('/') # 注冊(cè)路由 def hello_world(): # put application's code herereturn 'Hello World!'if __name__ == '__main__':app.run() # 默認(rèn)是host='127.0.0.1', port=5000端口'''這個(gè)時(shí)候訪問(wèn)5000端口跟路徑就能看到 Hellow World了 '''

三、Flask展示用戶信息案例

app.py

from flask import Flask, request, render_template, redirect, sessionapp = Flask(__name__) app.debug = True # print(app.config) # 拿到當(dāng)前app配置 app.secret_key = 'asdadadadLIkeasda1*asd12(01231' # 如果需要使用到session需要配置密鑰否則報(bào)錯(cuò)USERS = {1: {'name': 'Like', 'age': 21, 'gender': '男'},2: {'name': 'Lisa', 'age': 22, 'gender': '女'},3: {'name': 'Alice', 'age': 23, 'gender': '女'}, }@app.route('/login', methods=['GET', 'POST']) def login(): # put application's code hereif request.method == 'GET':return render_template('login.html') # 模版都需要寫在templates里面 可以通過(guò)settings修改名稱else:username = request.form.get('username') # Flask取數(shù)據(jù)從form里面獲取password = request.form.get('password')if username == 'Like' and password == '123':session['is_login'] = Truereturn redirect('/index')else:return render_template('login.html', errors='用戶名或密碼錯(cuò)誤')@app.route('/index', methods=['GET']) def index():if session.get('is_login'):return render_template('index.html', **{'users': USERS})else:return redirect('/login')@app.route('/detail/<int:id>') def detail(id):if session.get('is_login'):user = USERS.get(id)return render_template('detail.html', **{'user': user})else:return redirect('/login')if __name__ == '__main__':app.run()"""總結(jié):1.注冊(cè)路由:@app.route(" /detail/<int:id>" ,methods=['GET']) methods:允許的請(qǐng)求方式2.新手四件套:-返回模板:return render_template (' detail.html” , **{'user':user}) # Context跟Django不一樣-返回重定向:return redirect('/Login')-返回字符串:return '字符串'-返回json格式:return jsonify3. 使用cookie---就是session,全局的,導(dǎo)入使用即可,必須要指定秘鑰-放值:session[key] = value-取值:session.get('key')4.轉(zhuǎn)換器:@app.route('/detail/<int:id>'), 配合視圖函數(shù)寫法def detail(id)5.前端Post請(qǐng)求 提交數(shù)據(jù) request.form6.模版語(yǔ)法:兼容Django的Dtl語(yǔ)法, 它可以使用 V. V[''] V.get() 取值"""

login.html

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body> <form method="post"><p>用戶名: <input type="text" name="username"></p><p>密碼: <input type="password" name="password"></p><p>用戶名: <input type="submit" value="登錄"> <span>{{ errors }}</span></p> </form> </body> </html>

index.html

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body> <table>{% for k,v in users.items() %}<tr><td>{{ k }}</td><td>{{ v.name }}</td><td>{{ v['name'] }}</td><td>{{ v.get('name') }}</td><td><a href="/detail/{{ k }}">查看詳細(xì)信息</a></td></tr>{% endfor %} </table> </body> </html>

detail.html

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body> <h1>用戶名稱:{{ user.name }}</h1> {# 支持Django中的Dtl語(yǔ)法 #} <h1>用戶年齡:{{ user.age }}</h1> <h1>用戶性別:{{ user.gender }}</h1> </body> </html>

四、Flask配置文件

Flask中的配置文件是一個(gè)flask.config.config對(duì)象(繼承字典)如果不配置的話是有默認(rèn)配置的

{'DEBUG': get_debug_flag(default=False), '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 # 由于Config對(duì)象本質(zhì)上是字典,所以還可以使用app.config.update(...) app.config.from_pyfile('python文件名稱') # 使用本地配置文件 app.config.from_envvar('環(huán)境變量名稱') # 使用環(huán)境變量里面的信息 app.config.from_json('json文件名稱') # 必須為Json格式 因?yàn)閮?nèi)部會(huì)執(zhí)行json.loads app.config.from_mapping({'DEBUG': True}) # 字典格式 app.config.from_object('object / path') # python類或類的路徑

五、路由系統(tǒng)

1)路由系統(tǒng)

路由的典型寫法

@app.route('/detail/<int:id>', methods=['GET', 'POST'], endpoint='detail') # int轉(zhuǎn)換器 """methods: 列表規(guī)定了請(qǐng)求方式 如果列表中沒(méi)有請(qǐng)求方式不被允許endpoint: 路由別名 如果不寫會(huì)被裝飾的函數(shù)名作為別名 """

路由中的默認(rèn)轉(zhuǎn)換器

DEFAULT_CONVERTERS = {'default': UnicodeConverter, # 默認(rèn)'string': UnicodeConverter, # 字符串'any': AnyConverter, # 任何類型'path': PathConverter, # 路徑'int': IntegerConverter, # 數(shù)字'float': FloatConverter, # 小數(shù)'uuid': UUIDConverter, # asdad-asdda-asdaa }

2)路由本質(zhì)

1. decorator = app.route('/',methods=['GET','POST'],endpoint='n1') # 如果沒(méi)有傳endpoint,這個(gè)地方就是Nonedef route(self, rule, **options):# app對(duì)象 # rule= / # options = {methods=['GET','POST'], endpoint='n1'}def decorator(f):endpoint = options.pop('endpoint', None)self.add_url_rule(rule, endpoint, f, **options)# self是Flask的對(duì)象 app:rule路由 endpoint:別名,是None 其他的打散了傳入了(methods..)return freturn decorator2. @decoratordecorator(index)# 加了裝飾器最終,返回的還是index,只不過(guò)執(zhí)行了 self.add_url_rule(rule, endpoint, f, **options)"""Flask類中的add_url_rule方法最終意思:rule就是裝飾器傳入的路徑與路由endpoint別名view_func視圖函數(shù)不加括號(hào)最終結(jié)論“現(xiàn)在不需要使用裝飾器來(lái)注冊(cè)路由”app.add_url_rule('/home', view_func=home, endpoint='home')...(最終的結(jié)果就像Django中的SimpleRouter自動(dòng)生成路由 可以寫多個(gè))"""

3)Add_url_rule的參數(shù)

@app.route和app.add_url_rule參數(shù):rule == urlview_func == 視圖函數(shù)名稱defaluts == None 默認(rèn)值 需要穿值就是 defaluts = {'K': 'v'}endpoint == None 名稱 用于反向生成url methods = None 允許請(qǐng)求的方式strict_slashes = None 對(duì)url最后的/符號(hào)是否嚴(yán)格要求 # @app.route('/index', strict_slashes=False) 如果是True的話那就需要嚴(yán)格添加/否則匹配失敗redirect_to = None 重定向到指定地址# @app.route('/index/<int:id>', redirect_to='/home/<id>') 當(dāng)訪問(wèn)起那么這個(gè)路徑直接跳轉(zhuǎn)到后面這個(gè)路徑

六、Flask的CBV

1)CBV的寫法

from flask import Flask from flask.views import MethodViewapp = Flask(__name__)# @app.route('/test', methods=['GET', 'POST']) class Test(MethodView):def get(self):return '我是Get請(qǐng)求'def post(self):return '我是Post請(qǐng)求'app.add_url_rule('/test', view_func=Test.as_view(name='test'))# app.add_url_rule('/login', view_func=Login.as_view(name='index'))if __name__ == '__main__':app.run()

2)CBV添加裝飾器

class Test(MethodView):decorators = ['login', 'auth'] # 在類屬性中添加decorators屬性列表 是按照列表順序依次給每個(gè)方法添加裝飾器def get(self):return '我是Get請(qǐng)求''''首先會(huì)想我們裝飾器的原理@authdef view(): 本質(zhì)就是 view = auth(view) 當(dāng)作參數(shù)傳入返回函數(shù)看完源碼我們就知道了 是通過(guò)for循環(huán)的給視圖類添加裝飾器 '''

3)as_view的執(zhí)行流程

把源碼精簡(jiǎn)一下def as_view(cls, name, *class_args, **class_kwargs):def view(**kwargs):return self.dispatch_request(**kwargs)return viewdef dispatch_request(self, **kwargs):meth = getattr(self, request.method.lower(), None)return meth(**kwargs) 請(qǐng)求來(lái)了,路由匹配成功,會(huì)執(zhí)行as_view內(nèi)的view() 也執(zhí)行了類中的self.dispatch_request....這個(gè)就跟我們Django中的CBV一樣了然后看到self.dispatch_request中方法 ,在當(dāng)前視圖類中反射,請(qǐng)求方式的小寫字符串(get,post),如果我們寫了這些方法 就會(huì)去執(zhí)行。

4)Login.as_view(name=‘index’) name到底有什么用?

先研究endpoint有什么用,正常的fbv,如果不寫endpoint會(huì)以函數(shù)名作為別名endpoint如何設(shè)置的?如果endpoint為None,它把函數(shù)名作為了endpointif endpoint is None:endpoint = _endpoint_from_view_func(view_func) # view_func.__name__options["endpoint"] = endpoint # 如果都是endpoint就會(huì)沖突Login.as_view(name='index'),name到底有啥用app.add_url_rule('/login', view_func=Login.as_view('login'))沒(méi)有傳endpoint,Login.as_view('login')是view函數(shù)的內(nèi)存地址endpoint會(huì)以函數(shù)名作為endpoint的值,現(xiàn)在所有函數(shù)都是view,必須傳入name,來(lái)修改調(diào)view函數(shù)的名字如果傳了endpoint,別名以endpoint為主,如果不傳endpoint,別名以name為主app.add_url_rule('/login', view_func=Login.as_view(name='login'),endpoint='xxx')

5)CBV中得methods作用

視圖類中有個(gè)屬性就是methods = ['GET', 'POST'] 用來(lái)控制允許的請(qǐng)求方式 寫了什么方法 就允許什么請(qǐng)求 若沒(méi)有寫則不能使用該方法

七、模板語(yǔ)法

渲染變量

<table>{% for k,v in users.items() %}<tr><td>{{ k }}</td><td>{{ v.name }}</td><td>{{ v['name'] }}</td><td>{{ v.get('name') }}</td><td><a href="/detail/{{ k }}">查看詳細(xì)信息</a></td></tr>{% endfor %} </table>

變量的循環(huán)

<body><h1>用戶列表</h1><table>{% for k,v in user_dict.items() %}<tr><td>{{k}}</td><td>{{v.name}}</td><td>{{v['name']}}</td><td>{{v.get('name')}}</td><td><a href="/detail/{{k}}">查看詳細(xì)</a></td></tr>{% endfor %}</table> </body>

邏輯判斷

<body><h1>用戶列表</h1><table>{% if name %}<h1>Hello {{ name }}!</h1>{% else %}<h1>Hello World!</h1>{% endif %}</table> </body>

比Django中多了可以加括號(hào) 執(zhí)行函數(shù) 傳參數(shù)

from flask import Flask,render_template,Markup,jsonify,make_response app = Flask(__name__)def func1(arg):return Markup("<input type='text' value='%s' />" %(arg,)) @app.route('/') def index():return render_template('index.html',ff = func1)if __name__ == '__main__':app.run()index.html<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body>{{ff('六五')}}{{ff('六五')|safe}}</body></html>

總結(jié)

以上是生活随笔為你收集整理的Flask从入门到放弃(介绍、模版语法案例、配置文件、路由本质、CBV整体流程)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。