您好,登錄后才能下訂單哦!
#從flask這個(gè)包中導(dǎo)入Flask這個(gè)類
#Flask這個(gè)類是項(xiàng)目的核心,以后的很多操作都是基于這個(gè)類的對象
#注冊url,注冊藍(lán)圖都是這個(gè)類的對象
from flask import Flask
#創(chuàng)建一個(gè)Flask對象,傳遞__name__這個(gè)參數(shù)進(jìn)去
#__name__這個(gè)參數(shù)的作用:
# 1.規(guī)定模板和靜態(tài)資源的路徑
# 2.以后的一些Flask插件,比如Flask_migrate,Flask_SQLAlchemy報(bào)錯(cuò)的話,哪么Flask就會(huì)通過這個(gè)參數(shù)找到具體的報(bào)錯(cuò)位置
app = Flask(__name__)
# @app.route()是一個(gè)裝飾器,將對應(yīng)的“/”路徑應(yīng)用到hello_world()這個(gè)函數(shù)上面
# 在訪問“/”的時(shí)候在頁面上返回Hello World
@app.route('/')
def hello_world():
return 'Hello World!'
# 如果作為一個(gè)主文件運(yùn)行,哪么執(zhí)行app.run()方法,也就是啟動(dòng)這個(gè)網(wǎng)站
if __name__ == '__main__':
app.run()**strong text**
- 如果開啟了debug模式,name代碼在調(diào)試過程中出現(xiàn)了異常,在瀏覽器頁面中可以看到具體的報(bào)錯(cuò)信息,以及具體的錯(cuò)誤代碼位置,方便開發(fā)者調(diào)試。
- 如果flask開啟了debug模式,name以后再python中修改任何代碼,只要在pycharm中使用ctrl+s即可保存重載,不需要手動(dòng)去重載程序
app.run(debug=True)
app.debug = True
app.config.update[DEBUG=True]
#其實(shí)也就是update了config字典
**debug PIN碼**
``` python
D:\MyDevSoftInstallDir\Python3\python3.exe D:/myflask/base/base.py
然后在頁面上調(diào)試代碼的時(shí)候用到。
也是為了安全考慮。
## 配置文件兩種方式詳解
config.py
DEBUG=True
然后在主項(xiàng)目里面去讀取config.py
里面的配置:
from flask import Flask
import config
app = Flask(__name__)
app.config.from_object(config)
import config
config.py
DEBUG=True
然后在主項(xiàng)目里面去讀取config.py
里面的配置:
from flask import Flask
app = Flask(__name__)
app.config.from_pyfile('config.py',silent=True) #靜默模式加載配置文件(找不到配置文件不報(bào)錯(cuò)),文件的后綴名不可少
傳遞參數(shù)的語法是
/<參數(shù)類型:參數(shù)名稱>/
,然后在視圖函數(shù)中也要定義同名的參數(shù)
- string:只接受字符串,沒有任何“/或者\(yùn)”的文本
- int:只接受整數(shù)
- float:只接受浮點(diǎn)數(shù),整數(shù)都不行哈
- path:和
string
類似,但是接受斜杠- uuid:只有接受符合
uuid
的字符赤岸,一般用作表的主鍵- any:可以指定多種路徑
接收用戶傳遞參數(shù)的方式:
?key=value
的形式傳遞的,只能通過request.args.get的方式來獲?。?br/>如果頁面想要做SEO優(yōu)化的話,那么推薦使用path
的形式,反之就是查詢字符串的形式
from flask import Flask,request
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
@app.route('/list/')
def article_list():
return 'article list!'
@app.route('/p1/<article_id1>')
def article_detail(article_id1):
return "請求的文章是:%s" %article_id1
@app.route('/p2/<string:article_id2>')
def article_detail2(article_id2):
return "請求的文章是:%s" %article_id2
@app.route('/p3/<int:article_id3>')
def article_detail3(article_id3):
return "請求的文章是:%s" %article_id3
@app.route('/p4/<path:article_id4>')
def article_detail4(article_id4):
return "請求的文章是:%s" %article_id4
# import uuid
# print(uuid.uuid4())
@app.route('/p5/<uuid:article_id5>') #數(shù)據(jù)的唯一性,長度較長,有損效率(一般在用戶表中使用)6a9221f6-afea-424a-a324-8ceaa5bdfc98
def article_detail5(article_id5):
return "請求的文章是:%s" %article_id5
@app.route('/p6/<any(blog,user):url_path>/<id>/')
def detail(url_path,id):
if url_path == "blog":
return "博客詳情 %s" %id
else:
return "用戶詳情 %s" %id
#通過問號形式傳遞參數(shù)
@app.route('/d/')
def d():
wd = request.args.get('wd') #獲取瀏覽器傳遞參數(shù)
return '通過查詢字符串的方式傳遞的參數(shù)是,%s'%wd #請求http://127.0.0.1:8080/d/?wd=php
if __name__ == '__main__':
app.run(debug=True,host='0.0.0.0',port=8080)
url_for
的第一個(gè)參數(shù)是視圖函數(shù)的函數(shù)名對應(yīng)的字符串(endpoint),后面的參數(shù)就是你傳遞給url
;如果傳遞的參數(shù)在url
中已經(jīng)定義了,那么這個(gè)參數(shù)就會(huì)被當(dāng)成path的值傳遞給url
;如果這個(gè)參數(shù)沒有在url
中定義,那么將變成查詢字符串的形式
from flask import Flask,url_for,request
app.route('/')
return url_for('my_list',page=1,count=2) #這樣的話就會(huì)在頁面上構(gòu)建出/post/list/1/?count=2的信息
app.route('/post/list/<page>/')
def my_list():
return 'my list'
url_for
?
如果將來要修改
URL
,但沒有修改URL
對應(yīng)的函數(shù)名,就不用到處去替換URL了。URL
會(huì)自動(dòng)處理特殊字符(轉(zhuǎn)義成十六進(jìn)制),不需要手動(dòng)去處理from flask import Flask,url_for,request @app.route('/') def hello_world(): return url_for('login',next='/current') #頁面返回/login/?next=%2Fcurrent登錄前的信息 # print(url_for('my_list',page=1,count=200)) # return 'hello world' @app.route('/login/') def login(): # next = request.args.get('next') #登錄前的信息,在登陸之后仍舊保持 return 'login' @app.route('/list/<page>') def my_list(): return 'my list' @app.route('/detail/<id>/') def detail(): return 'detail' if __name__ == '__main__': app.run(debug=True)
自定義url轉(zhuǎn)換器
url
轉(zhuǎn)換器的方式:
- 實(shí)現(xiàn)一個(gè)類,繼承
BaseConverter
- 在自定義的類中重寫
regex
,也就是這個(gè)變量的正則表達(dá)式- 將自定義的類映射到
app.url_map.converters
上。
實(shí)現(xiàn)用戶訪問/posts/a+bto_python
的作用
這個(gè)方法的返回值會(huì)傳到view函數(shù)中作為參數(shù)to_url
的作用
這個(gè)方法的返回值會(huì)調(diào)用url_for來生成符合要求的url形式from flask import Flask,url_for from werkzeug.routing import BaseConverter app = Flask(__name__) #手機(jī)號碼正則 class TelephoneConveter(BaseConverter): regex = r'1[85734]\d{9}' app.url_map.converters['tel'] = TelephoneConveter #用戶訪問/posts/a+b/ class ListConverter(BaseConverter): def to_python(self, value): return value.split("+") def to_url(self, value): print(value) return '+'.join(value) # return "hello" app.url_map.converters['list'] = ListConverter @app.route('/') def hello_world(): print(url_for('posts',broads=['a','b'])) return 'Hello World!' @app.route('/user/<int:user_id>/') def user(user_id): return "your user id is %d" %user_id @app.route('/telephone/<tel:my_tel>/') def my_tel(my_tel): return "your telephone number is %s"%my_tel @app.route('/posts/<list:broads>/') def posts(broads): # broads = broads.split("+") return "your posts is %s"%broads if __name__ == '__main__': app.run(debug=True)
小細(xì)節(jié)
在局域網(wǎng)訪問站點(diǎn)
app.run(host='0.0.0.0')
指定端口號
默認(rèn)是5000端口,修改端口如下
app.run(host='0.0.0.0',port=8899 )
ulr唯一
URL
的時(shí)候,盡量在url后面加/
,原因如下:
/
的話瀏覽器訪問這個(gè)url的時(shí)候會(huì)默認(rèn)加/
,這樣的話就訪問不到了/
的url和加/
的url是兩個(gè)不同的url,會(huì)將其誤解。GET
,POST
,DELETE
,PUT
,常用的請求方式如下:GET
:也就是獲取
服務(wù)器上的資源,不會(huì)修改服務(wù)器上的內(nèi)容。POST
:就是向服務(wù)器提交文件或者數(shù)據(jù),一般POST會(huì)對服務(wù)器的狀態(tài)產(chǎn)生影響。GET
:把參數(shù)放到URL
中,通過?xx=xxx
的形式傳遞的,因?yàn)闀?huì)把參數(shù)放到url中,所以視力好的話,一眼就可以看到傳遞的參數(shù)。POST
:把參數(shù)放到Form Data
中,避免被偷窺到的風(fēng)險(xiǎn)(也有可能通過抓包的方式被竊?。话悴话踩?,不曉得提交的內(nèi)容是否是帶病毒的文件。
在
flask
中,route
方法,默認(rèn)只能使用GET
的方式請求url。如果想要設(shè)置自己的請求方式,那就要在methods
中多傳遞一個(gè)請求方式的參數(shù)。
實(shí)例如下:
創(chuàng)建url_detail的項(xiàng)目,項(xiàng)目結(jié)構(gòu)如下:├─url_detail.py ├─static └─templates |_login.html
from flask import Flask,request,render_template
app = Flask(__name__)
@app.route('/',methods=['GET'])
def hello_world():
return 'Hello World!'
@app.route('/list/',methods=['POST'])
def my_list():
return 'list'
@app.route('/login/',methods=["POST","GET"])
def login():
if request.method == 'GET':
return render_template('login.html')
else:
return "Success"
if __name__ == '__main__':
app.run(debug=True,host='0.0.0.0')
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="",method="POST">
<input type="text",name="username">
<input type="text",name="password">
<input type="submit",name="submmit">
</form>
</body>
</html>
也就是從一個(gè)頁面跳轉(zhuǎn)到另一個(gè)頁面,也就是重新定位一個(gè)方向
分類:
jingdong.com
了在flask中,重定向是通過
flask.redirect(location,code=302)
這個(gè)函數(shù)來實(shí)現(xiàn)的,location
指的是需要重定向到的URL
,應(yīng)該配合之前講過的url_for()
來是用。code
代表的是什么類型的重定向,默認(rèn)是302,可以修改成301實(shí)現(xiàn)永久重定向。
from flask import Flask,url_for,redirect,request
app = Flask(__name__)
app.debug = True
@app.route('/login/',methods=['GET','POST'])
def login():
return 'login page'
@app.route('/profile/',methods=['GET','POST'])
def profile():
name = request.args.get('name')
if not name:
return redirect(url_for('login'))
else:
return name
if __name__ == '__main__':
app.run()
這樣的話就能訪問profile了:
http://127.0.0.1:5000/profile/?name=sss
視圖函數(shù)的返回值會(huì)被自動(dòng)轉(zhuǎn)換成一個(gè)響應(yīng)對象,flask的轉(zhuǎn)換邏輯如下:
werkzeug.wrappers.Response
對象。Response
會(huì)將該字符串作為主體,狀態(tài)碼為200,MIME
的類型為text/html
,然后返回給Response對象response,status,headers
,status會(huì)覆蓋默認(rèn)的200狀態(tài)碼,headers可以是一個(gè)字典或者列表。作為額外的消息頭WSGI
應(yīng)用程序,并通過Response.force_type(rv,request.environ)
轉(zhuǎn)換成一個(gè)請求對象。Response
類force_type
force_type
,然后將force_type
的返回值返回給前端。
#!/usr/bin/python
# -*- coding:utf8 -*-
from flask import Flask,Response,jsonify
import json
app = Flask(__name__)
app.debug = True
#自定義響應(yīng)
class JSONResponse(Response):
@classmethod
def force_type(cls, response, environ=None):
'''
這個(gè)方法只有視圖函數(shù)返回非字符串,非元組,非Response對象才會(huì)調(diào)用
:param response:
:param environ:
:return:
'''
print response
print type(response)
if isinstance(response,dict):
#jsonify除了將字典轉(zhuǎn)換成為json對象,還將對象封裝成了一個(gè)Response對象
response = jsonify(response)
#response = json.dumps(response) #這樣轉(zhuǎn)換的話程序啟動(dòng)會(huì)報(bào)錯(cuò)
return super(JSONResponse,cls).force_type(response,environ) #返回父類信息
app.response_class = JSONResponse
@app.route('/')
#第一種情況
def hello_world():
#Response('Hello World',status=200,mimetype='text/html')
return 'Hello World!'
#第二種情況
@app.route('/list1/')
def list1():
resp = Response('List1')
resp.set_cookie('country','china')
return resp
#第三種情況
@app.route('/list2')
def list2():
return 'list2',200,{'X-Name':'abc'}
@app.route('/list3/')
def list3():
return {"username":"abc","age":11}
if __name__ == '__main__':
app.run(host='0.0.0.0')
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。