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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

flask(一)之路由和视图

發(fā)布時(shí)間:2025/5/22 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 flask(一)之路由和视图 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?01-介紹

?Flask 是一個(gè) Python 實(shí)現(xiàn)的 Web 開發(fā)微框架,同時(shí)具有很強(qiáng)的擴(kuò)展能力。

02-第一個(gè)flask程序

# 初始化from flask import Flask, url_for, views app = Flask(__name__)

Flask類的構(gòu)造函數(shù)只有一個(gè)必須指定的參數(shù),即應(yīng)用主模塊或包的名稱。在大多數(shù)應(yīng)用中,Python的__name__變量就是所需的值。

from flask import Flask# 創(chuàng)建flask對(duì)象,傳遞__name__參數(shù)進(jìn)去 app = Flask(__name__)# url與視圖映射 @app.route('/') def hello_world():return 'Hello World!'if __name__ == '__main__':app.run() # 也可以更改端口號(hào) run(port=5500)

03-設(shè)置debug模式

from flask import Flask import config #創(chuàng)建一個(gè)Flask對(duì)象,傳遞__name__參數(shù)進(jìn)去 app = Flask(__name__) # app.debug = True #第二種 # app.config.update(DEBUG=True) #第三種 app.config.from_object(config) #第四種#url與視圖映射 @app.route('/') def hello_world():print('helloworkl')return 'Hello World!'if __name__ == '__main__':# app.run(debug=True) #第一種app.run()

04-配置文件

?新建config.py

DEBUG =True

主程序中的兩種引用方式:

# 第一種:推薦使用 import config app.config.from_object(config) # 第二種: app.config.from_pyfile('config.py')

05-url傳參方式

from flask import Flask, request# 創(chuàng)建flask對(duì)象,傳遞__name__參數(shù)進(jìn)去 app = Flask(__name__)# 普通的傳參方式 127.0.0.1:5000/p/1 @app.route('/p/<id>/') def article_detail(id):return '你訪問的文章第%s篇' % id""" 指定參數(shù)類型 有以下幾種類型:string:默認(rèn)的數(shù)據(jù)類型int:接受整形float:浮點(diǎn)型path:和string的類似,但是接受斜杠any:可以指定多個(gè)路徑uuid:只接受uuid字符串 """# any: 127.0.0.1:5000/blog/id 127.0.0.1:5000/user/id @app.route('/<any(blog,user):url_path>/<id>') def detail(url_path, id):if url_path == 'blog':return '博客詳情%s' % idelse:return '用戶詳情%s' % id# path: 127.0.0.1:5000/article/python/1/ @app.route('/article/<path:test>/') def test_article(test):return 'test_article:{}'.format(test)# 獲取參數(shù) 127.0.0.1:5000/tieba/?wd=python @app.route('/tieba/') def tieba():wd = request.args.get('wd')return '獲取的參數(shù)的是%s' % wdif __name__ == '__main__':app.run()

06-url_for:實(shí)現(xiàn)創(chuàng)建url,只是生成一個(gè)url

如果要生成一個(gè)css樣式的靜態(tài)文件的url需要使用url_for('static',filename='style.css')來創(chuàng)建相應(yīng)的url。

視圖中的url_for:

# 1. 通過視圖函數(shù)解析出urlfrom flask import Flask, url_for@app.route('/') def hello_world():# url_for里面:第一個(gè)是視圖函數(shù),第二個(gè)是url需要的參數(shù)return url_for('my_list',page=2) @app.route('/list/<page>/') def my_list(page):return 'my_list'訪問 127.0.0.1:5000/,結(jié)果:/list/2/# 2. url_for里面多的參數(shù)會(huì)當(dāng)做搜索字符 @app.route('/') def hello_world():return url_for('my_list',page=2,count=2) @app.route('/list/<page>/') def my_list(page):return 'my_list'訪問 127.0.0.1:5000/,結(jié)果:/list/2/?count=2

模板中的url_for:

模板中的url_for和視圖函數(shù)中的url_for是類似的,也是傳遞視圖函數(shù)的名字,也可以傳遞參數(shù)。使用的時(shí)候,需要在url_for兩邊加上一個(gè){{ url_for('func_name'),ref='/',id='1'}}

07-Response

視圖函數(shù)中可以返回的類型:1. 可以返回字符串,返回的字符串其實(shí)底層將這個(gè)字符串包裝成了一個(gè)‘Response’對(duì)象2. 可以返回元組,形式(響應(yīng)體,狀態(tài)碼,頭部信息),返回的元組其實(shí)底層將這個(gè)字符串包裝成了一個(gè)‘Response’對(duì)象3. 可以返回Response及其子類實(shí)現(xiàn)一個(gè)自定義的Response對(duì)象:1.繼承自、‘Response’類2. 實(shí)現(xiàn)方法‘force_type’3. 指定‘a(chǎn)pp.response_class’為你自定義的‘Response’對(duì)象4. 如果視圖函數(shù)返回的數(shù)據(jù),不是字符串,也不是元組,也不是Response對(duì)象,那么就會(huì)將返回值傳給‘force_type’,然后將‘force_type’的返回值返回給前端 from flask import Flask,url_for,Response,jsonifyapp = Flask(__name__)class JsonResponse(Response):@classmethoddef force_type(cls, response, environ=None):'''這個(gè)方法只有視圖函數(shù)返回非字符、非元祖、非Response對(duì)象才會(huì)調(diào)用:param response::param environ::return:'''# 把字典轉(zhuǎn)換成jsonif isinstance(response,dict):# jsonify將字典轉(zhuǎn)換成json對(duì)象,還將該對(duì)象包裝成了一個(gè)Response對(duì)象response = jsonify(response)return super(JsonResponse, cls).force_type(response,environ)app.response_class = JsonResponse@app.route('/') def hello_world():return 'Hello world'@app.route('/list1/') def list1():return Response('list1') # 合法對(duì)象,直接返回 @app.route('/list3/') def list3():return {'username':'derek','age':18} # 返回的是非字符、非元祖、非Response對(duì)象,所以執(zhí)行force_type方法if __name__ == '__main__':app.run(debug=True)

08-add_url_rule:

from flask import Flask, render_template, url_forapp = Flask(__name__) app.config.update({'DEBUG':True,
   # 配置自動(dòng)加載模板文件,調(diào)試模式下會(huì)自動(dòng)開啟
'TEMPLATES_AUTO_RELOAD':True })@app.route('/',endpoint='index') def hello_world():print(url_for("derek_list")) # 通過endpoint找到對(duì)應(yīng)的url /list/return render_template('index.html')def my_list():return "列表頁(yè)"# 三個(gè)參數(shù) # 1.url # 2.給url起個(gè)別名,如果沒有指定endpoint,則默認(rèn)使用視圖函數(shù)的名字作為endpoint的值 # 3.視圖函數(shù) app.add_url_rule('/list/',endpoint='derek_list',view_func=my_list)with app.test_request_context():print(url_for('index')) # /if __name__ == '__main__':app.run()

09-render_template:?渲染模板文件

from flask import Flask, render_template, url_forreturn render_template('index.html')

10-send_from_directory:主要用于下載文件

from flask import Flask from flask import g from flask import send_from_directory from flask import url_for import os.pathapp = Flask(__name__) dirpath = os.path.join(app.root_path,'upload') @app.route("/download/<path:filename>") def downloader(filename):return send_from_directory(dirpath,filename,as_attachment=True)

?11-static_url_path和static_folder

?static_url_path主要用于改變url的path的,靜態(tài)文件放在static下面,所以正常情況url是static/filename ,但是可以通過static_url_path來改變這個(gè)url。

?static_folder主要是用來改變url的目錄的,默認(rèn)是static,可以通過這個(gè)變量來改變靜態(tài)文件目錄。

from flask import Flask from flask import g from flask import send_from_directory from flask import url_for import os.pathapp = Flask(__name__,static_url_path="/test")@app.route("/") def static_create():return url_for('static',filename='style.css')

12-Request對(duì)象

Request是Flask中表示當(dāng)前請(qǐng)求的request對(duì)象,一般稱之為請(qǐng)求上下文變量(可以理解成全局變量,在任意一個(gè)視圖中都可以訪問到)。常用的屬性有:args:url中的查詢字符串。本質(zhì)上是鍵值對(duì),跟在"?"后面,多個(gè)鍵值對(duì)之間使用"&"連接;form:請(qǐng)求url中的表單數(shù)據(jù)。也是由鍵值對(duì)組成,一般使用post方法提交數(shù)據(jù)cookies:請(qǐng)求中的cookie信息。由服務(wù)器生成的鍵值對(duì),把值發(fā)送給客戶端并保存,稍后重點(diǎn)講解!files:上傳的文件

12-類視圖

1. 繼承views.VIew。 2. 必須實(shí)現(xiàn)‘dispatch_request’方法,以后請(qǐng)求過來后,都會(huì)執(zhí)行這個(gè)方法,返回值相當(dāng)于視圖函數(shù)一樣,必須返回'Response'或者子類的對(duì)象,或者是字符串,或者是元祖。 3. 必須通過app.add_url_role(url_rule,view_func)來做url與視圖的映射。 from flask import Flask, url_for, views # 創(chuàng)建一個(gè)Flask對(duì)象,傳遞__name__參數(shù)進(jìn)去 app = Flask(__name__)app.config.update({'DEBUG': True,'TEMPLATES_AUTO_RELOAD': True, })class ListView(views.View):def dispatch_request(self):return "我的列表頁(yè)"# 1.ListView.as_view('list')里面必須傳個(gè)參數(shù)‘name’,給view_func起個(gè)別名,實(shí)際上就是dispatch_request函數(shù) # 2.endpoint也可以不指定,則默認(rèn)使用view_func的別名(name參數(shù)的值) app.add_url_rule('/list/', endpoint='list', view_func=ListView.as_view('list'))# url與視圖映射 @app.route('/') def hello_world():return 'Hello World!'if __name__ == '__main__':app.run(port=5555)

13-通過類的繼承實(shí)現(xiàn)多個(gè)視圖返回json數(shù)據(jù)

from flask import Flask,url_for,views,jsonifyapp = Flask(__name__) app.config.update({'DEBUG':True,'TEMPLATES_AUTO_RELOAD':True })# 父類,把數(shù)據(jù)轉(zhuǎn)換成json格式 class JsonView(views.View):def get_data(self):raise NotImplementedErrordef dispatch_request(self):return jsonify(self.get_data())# 子類只需要寫get_data方法 class ListView(JsonView):def get_data(self):return {"usernmae":'derek','age':18}app.add_url_rule('/list/',endpoint='list',view_func=ListView.as_view('list'))@app.route('/') def hello_world():return 'Hello World!'if __name__ == '__main__':app.run()

14-基于調(diào)度方法的類視圖

class LoginView(views.MethodView):def __render(self,error=None):return render_template('login.html', error=error)def get(self,error=None):return self.__render()def post(self):username = request.form.get('username')password = request.form.get('password')if username == 'derek' and password == '123':return '登錄成功'else:return self.__render(error='用戶名或密碼錯(cuò)誤')app.add_url_rule('/login/',view_func=LoginView.as_view('login'))

?15-路由

方式一:

  在Flask應(yīng)用中定義路由的最簡(jiǎn)單方式,是使用應(yīng)用實(shí)例提供的 app.route 裝飾器。

# url與視圖映射 @app.route('/') def hello_world():return 'Hello World!'

方式二:

  使用 add_url_rule()方法。接收3個(gè)參數(shù):URL,端點(diǎn)名和視圖函數(shù)。

16-Web開發(fā)服務(wù)器

Flask應(yīng)用自帶Web服務(wù)器,通過 flask run 命令啟動(dòng)。這個(gè)命令在 FLASK_APP 環(huán)境變量指定的python腳本中尋找應(yīng)用的實(shí)例。

$ export FLASK_APP=hello.py$ flask run

17-請(qǐng)求-響應(yīng)循環(huán)

17.1 應(yīng)用和請(qǐng)求上下文

為了避免大量可有可無的參數(shù)把視圖函數(shù)弄得很亂,Flask使用 上下文 臨時(shí)把一些變量變?yōu)槿挚梢栽L問。

在Flask中有兩種上下文:應(yīng)用上下文和請(qǐng)求上下文。

注意:獲取應(yīng)用上下文的方法是應(yīng)用實(shí)例上調(diào)用 app.app_context()。

17.2 請(qǐng)求分派

17.3 請(qǐng)求對(duì)象

Falsk通過上下文變量request對(duì)外開放請(qǐng)求對(duì)象,包含了客戶端發(fā)送的HTTP請(qǐng)求的全部信息。

Flask請(qǐng)求中最常用的屬性和方法:

17.4 請(qǐng)求鉤子

?

轉(zhuǎn)載于:https://www.cnblogs.com/pgxpython/p/10381905.html

總結(jié)

以上是生活随笔為你收集整理的flask(一)之路由和视图的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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