本來打算新開一篇,但是太短了,就整合到這裡了
from flask import Flask
import config
app = Flask(__name__)
app.config.from_object(config)
@app.route('/') #定義一個路由
def hello_world(): #定義一個視圖函式
return 'Hello World!'
if __name__ == '__main__':
app.run()
其中config
文件時從配置文件中開啟debug
也可以在app.run(debug=True)
這樣開啟debug
因為後期鏈接數據庫的配置卸載config
中,所以這裡使用配置文件開啟debug
這裡有個坑,就是專業版的pycharm,創建一個flask項目的話debug
要在Configurations
下勾選FLASK_DEBUG
不然開啟不了
注意 在配置文件里DEBUG
要大寫
from flask import Flask
import config
app = Flask(__name__)
app.config.from_object(config)
@app.route('/hello')
def hello_world():
return 'Hello World!'
#app.route('/hi/')
def hi_world():
return 'hi World!'
if __name__ == '__main__':
app.run()
用來反轉URL
,url_for
這個方法的第一個參數是視圖函式的名稱,後面的是傳遞的參數,如果在視圖函式中這個參數定義了,那麼就會當成path
傳給這個url
,如果沒有定義,那麼就會當成get請求,傳入url
中。
注意 url_for
會自動處理特殊字符,例如/
當你訪問127.0.0.1/hello/
的時候會Not Found
但是訪問127.0.0.1/hi/
不會,因為127.0.0.1/hi/
就相當於在訪問的127.0.0.1/hi
做了一個重定向,跳轉到127.0.0.1/hi/
傳遞參數的語法是://
。然後再試圖函式中,也要定義同名的參數。
@app.route('/get/')
def arg_get():
wd = request.args.get('wd') #get請求參數
return 'get請求的參數是%s' % wd
string
int
,float
就只能傳遞相應的數據類型path
類型,與string
類型相似,但是可以傳遞路徑,即可以出現/
uuid
類型,只接受uuid字符串,唯一的any
類型,可以指定多種路徑,這個通過一個例子來說明@app.route('/<any(blog,user):url_path>/<id>')
def detaol(url_path,id):
if url_path=='blog':
return '博客詳情 %s' % id
else:
return '使用者詳情 %s' % id
意思就是,你可以選擇傳入的時blog
還是user
自訂個url類型轉換器
首先導入from werkzeug.routing import BaseConverter
模塊
ctrl+b進入源碼,可以看到這裡定義的BaseConverter
類,下面的PathConverter
,NumberConverter
等,就是之前的參數數據類型都是繼承了這個類,然後通過一些方法來定義的轉換器,定義完成後加入到DEFAULT_CONVERTERS
對應關係中。通過app.url_map.converters['轉換器名'] = 定義的轉換規則
來加入到對應關係中
例1,定義一個簡單的手機號碼轉換器
from flask import Flask
from werkzeug.routing import BaseConverter
import config
app = Flask(__name__)
app.config.from_object(config)
# 限定手機號碼的格式
class TelConverter(BaseConverter):
regex = r'1[85734]\d{9}'
#添加到轉換器中
app.url_map.converters['tel'] = TelConverter
#使用定義的轉換器
@app.route('/tel/<tel:my_tel>/')
def tel(my_tel):
return 'your tel is %s' % my_tel
例2,定義一個按照規則分離出兩個參數的轉換器
介紹兩種方法
to_python
方法:將傳入的value
返回到視圖函式中做參數
to_url
方法:將傳入的value
調用url_for生成符合要求的url形式
然後定義一個轉換器
class ListConverter(BaseConverter):
def to_python(self, value):
return value.split('+')
def to_url(self, value):
return '+'.join(value)
app.url_map.converters['list'] = ListConverter
@app.route('/')
def hello_world():
url = url_for('postsa',broad=['a','b'])
return url
@app.route('/posts/<list:broads>/')
def postsa(broads):
return "your posts is %s"%broads
重定向分為永久性重定向和暫時性重定向,在頁面上體現的操作就是瀏覽器會重一個頁面自動跳轉另外一個頁面,比如使用者訪問了一個需要權限的頁面,但是該使用者當前並沒有登錄,因此我們給它重定向到登錄頁面
永久性重定向:_http的狀態碼是301,多用於舊網址就廢棄了要轉到一個新的網址確保使用者的訪問www.jingdong.com —> www.jd.com
暫時性重定向:http的狀態碼是302,表示頁面的暫時性跳轉。比如訪問一個需要權限的網址,如果使用者沒有登錄,應該重定向到登錄頁面,這種情況下,應該用暫時性重定向
在flask中,重定向是通過flask.redirect(location,code=302)這個函式來實現,location表示需要重定向的url,應該配合之前將的url_for()函式來使用,code表示採用那個重定向,預設是302即暫時性重定向,可以修改成301來實現永久性重定向
可以使用 redirect()
方法配合url_for()
反轉url來實現跳轉
from flask import Flask,redirect,url_for
from datetime import datetime
app = Flask(__name__)
@app.route('/')
def index():
return 'hello world'
@app.route('/login/<username>')
def login(username):
if username=='admin':
return "hello %s" % username
else:
return redirect(url_for("index")) #重定向到index
if __name__ == '__main__':
app.run(debug=True)