flask的URL與視圖

一、虛擬環境安裝

安裝 pipenv 管理 python 開發環境

  • 安裝

pip install pipenv
pipenv install --dev six # 只將模塊安裝到開發環境中
  • 進入/退出/刪除虛擬環境

pipenv shell    # 進入虛擬環境
exit            # 退出虛擬環境
pipenv --rm     # 刪除整個環境  不會刪除pipfile  退出環境再進行刪除
pipenv          # 查看更多命令幫助
pipenv  --venv  # 查看虛擬環境位置

更多命令參考文章

  • 自定義虛擬環境路徑

在使用 pycharm 開發時,需要找到對應的 python.exe (也就是設置對應的環境),爲了方便管理環境,可以進行自定義設置
在這裏插入圖片描述

二、項目創建

  • 方法一

利用 pycharm 創建項目(專業版)
在這裏插入圖片描述
在這裏插入圖片描述

  • 方法二

app.run這種方式只適合於開發,如果在生產環境中,應該使用Gunicorn或者uWSGI來啓動。如果是在終端運行的,可以按ctrl+c來讓服務停止。

直接創建
在這裏插入圖片描述

@app.route("/") 代表訪問的是 / 也就是根目錄
hello_world 函數就是首頁實現的效果
雖然訪問 http://127.0.0.1:5000/ 的時候不寫/ 也可以訪問到首頁,但是這樣寫讓代碼一目瞭然
app.run() 讓項目跑起來 
跑項目的時候需要注意項目的環境的正確配置,避免項目啓動失敗哦。

三、啓動項目和開啓 Debug 模式

Debug mode: off
上面非 Debug 模式進行調試項目需要每次重啓項目,所以更改代碼,開啓 Debug 模式

# 方法一
app.run(debug=True)
# 這個方法有一個 port 參數來改變端口值
# 方法二
# app.debug = True  
# app.run()
# 方法三
# app.config 是個繼承字典的類  使用update方法
# app.config.update(DEBUG=True)
# app.run()

# 使用配置文件幫助代碼管理
# app.config.from_object(config)
# app.run()

Debug mode: on

Debugger PIN: 758-272-092 在報錯的情況下,可直接提供在顯示頁面進行調試的通信證

四、項目配置

Flask項目的配置,都是通過app.config對象來進行配置的。比如要配置一個項目處於DEBUG模式下,那麼可以使用app.config['DEBUG] = True來進行設置,那麼Flask項目將以DEBUG模式運行。在Flask項目中,有四種方式進行項目的配置
  1. 直接硬編碼
app = Flask(__name__)
app.config['DEBUG'] = True
  1. 因爲app.config是flask.config.Config的實例,而Config類是繼承自dict,因此可以通過update方法
app.config.update(
   DEBUG=True,
   SECRET_KEY='...'
)
  1. 如果你的配置項特別多,你可以把所有的配置項都放在一個模塊中,然後通過加載模塊的方式進行配置,假設有一個settings.py模塊,專門用來存儲配置項的,此時你可以通過app.config.from_object()方法進行加載,並且該方法既可以接收模塊的的字符串名稱,也可以模塊對象
# 1. 通過模塊字符串
app.config.from_object('settings')
# 2. 通過模塊對象
import settings
app.config.from_object(settings)

4.也可以通過另外一個方法加載,該方法就是app.config.from_pyfile(),該方法傳入一個文件名,通常是以.py結尾的文件,但也不限於只使用.py後綴的文件

app.config.from_pyfile('settings.py',silent=True)

from juran

五、URL 與函數映射

一個URL要與執行函數進行映射,使用的是@app.route裝飾器。@app.route裝飾器中,可以指定URL的規則來進行更加詳細的映射。
案例:映射一個文章詳情的URL
語法提示:尖括號是固定寫法< variable >,指定類型則要寫成 < converter:variable >

  • 基本映射(默認string)

string: 默認的數據類型,接受沒有任何斜槓/的字符串

# 設置一個列表頁面
# http://127.0.0.1:5000/list/12
@app.route("/list/<aid>")
def article_list(aid):
    return "這是第{}篇文章".format(aid)
  • int: 整形 float: 浮點型

# 不接受除了數字之外的
@app.route("/list/<int:aid>")
def article_list(aid):
    return "這是第{}篇文章".format(aid)
  • path: 和string類似,但是可以傳遞斜槓/

# detial 頁面
# 接受參數爲 / 和字母  純數字則調用回 article_list
@app.route("/list/<path:aid>")
def article_detail(aid):
    return "detial-這是第{}篇文章".format(aid)

url 地址 匹配對比:
同時兼具 int 和 path

  • uuid: uuid類型的字符串

  • any:可以指定多種路徑

# /<any(article, blog):url_path>/  冒號後面不可以加空格
@app.route("/<any(article, blog):url_path>/")
def item(url_path):
    return url_path
  • =?

通過傳統的?=的形式來傳遞參數,可以通過request.args.get(‘id’)來獲取id的值。
如果是post方法,則可以通過request.form.get(‘id’)來進行獲取。

# http://127.0.0.1:5000/wd?name=aa
@app.route("/wd")
def baidu():
    return request.args.get("name")
  • 構造URL(url_for)

url_for函數可以幫我們實現通過一個函數去獲得這個URL。
url_for()函數接收兩個及以上的參數,他接收函數名作爲第一個參數,接收對應URL規則的命名參數,如果還出現其他的參數,則會添加到URL的後面作爲查詢參數。

# return 是頁面信息 
# 打印是在編譯器控制檯內進行打印
@app.route("/")
def index():
    print(url_for("article_list", aid=2))  # article_list 有一個 aid 參數,在 url_for 的時候要帶上
    return "hello world"

@app.route("/article/<aid>/")
def article_list(aid):
    return "article list {}".format(aid)

@app.route("/detail/<did>/")
def article_detail(did):
    # print(url_for("index"))   # index 沒有參數傳入 url
    print(url_for("index", next="/"))   # 傳入不存在的參數 打印信息爲/?next=%2F  這是對特殊字符/進行了轉義
    return "article detail {}".format(did)
  • 指定HTTP 方法

在@app.route()中可以傳入一個關鍵字參數methods來指定本方法支持的HTTP方法,默認情況下,只能使用GET請求

# methods 讓其可以接收 GET','POST 兩種請求
@app.route("/signup/", methods=['GET','POST'])
def login():
    # print(type(request.args))
    # get 請求
    # http://127.0.0.1:5000/signup/?username=juju
    print(request.args.get('username'))
    # post 請求
    # print(request.form.get("name"))
    return "login"

postman中發送post請求

  • flask 的重定向

在flask中,重定向是通過flask.redirect(location,code=302)這個函數來實現的,location表示需要重定向到的URL,配合url_for()函數來使用,code表示採用哪個重定向,默認是302也即暫時性重定向,可以修改成301來實現永久性重定向

# 訪問 http://127.0.0.1:5000/profile/ 會被重定向 狀態碼302
@app.route("/profile/")
def profile():
    name = request.args.get("name")
    
    if name:
        return name
    else:
        # 重定向
        return redirect(url_for("login"))  # code=301
  • 關於 flask 的響應

  • 字符串。其實Flask是根據返回的字符串類型,重新創建一個werkzeug.wrappers

return "nnn"
  • Response對象,Response將該字符串作爲主體,狀態碼爲200,MIME類型爲text/html,然後返回該Response對象。
from werkzeug.wrappers import Response

@app.route('/about/')
def about():
	resp = Response(response='about page',status=200,content_type='text/html;charset=utf-8')
	return resp

  • 元組。元組中格式是(response,status,headers)。response爲一個字符串,status值是狀態碼,headers是一些響應頭。
return ('關於我們',200)  # 只返回 關於我們
  • dict
  • 可以使用make_response函數來創建Response對象,這個方法可以設置額外的數據,比如設置cookie,header信息
rom flask import make_response

@app.route('/about/')
def about():
    return make_response('about page')  # 這個必須要有返回值
	如果不是以上三種類型。那麼Flask會通過Response.force_type(rv,request.environ)轉換爲一個請求對象
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章