成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

flask基礎(chǔ)之一

fevin / 2240人閱讀

摘要:最經(jīng)典的就是了暫時(shí)性重定向的狀態(tài)碼是,表示頁面暫時(shí)性被跳轉(zhuǎn),比如訪問一個(gè)需要權(quán)限的網(wǎng)址,如果當(dāng)前用戶沒有登錄,應(yīng)該重定向到登錄頁面。作為額外的消息頭如果以上的條件都不滿足,會(huì)假設(shè)返回值是一個(gè)合法的應(yīng)用程序,并通過轉(zhuǎn)換成一個(gè)請(qǐng)求對(duì)象。

flask基礎(chǔ)之一 hello world
#從flask這個(gè)包中導(dǎo)入Flask這個(gè)類
#Flask這個(gè)類是項(xiàng)目的核心,以后的很多操作都是基于這個(gè)類的對(duì)象
#注冊(cè)u(píng)rl,注冊(cè)藍(lán)圖都是這個(gè)類的對(duì)象
from flask import Flask
#創(chuàng)建一個(gè)Flask對(duì)象,傳遞__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è)裝飾器,將對(duì)應(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()
debug模式

為什么要開啟DEBUG模式?

如果開啟了debug模式,name代碼在調(diào)試過程中出現(xiàn)了異常,在瀏覽器頁面中可以看到具體的報(bào)錯(cuò)信息,以及具體的錯(cuò)誤代碼位置,方便開發(fā)者調(diào)試。

如果flask開啟了debug模式,name以后再python中修改任何代碼,只要在pycharm中使用ctrl+s即可保存重載,不需要手動(dòng)去重載程序

如何配置debug模式:

app.run()

app.run(debug=True)

app.debug

app.debug = True

配置信息方式(使用參數(shù)形式的方式)

app.config.update[DEBUG=True]
#其實(shí)也就是update了config字典

通過配置文件的形式

- 創(chuàng)建一個(gè)config.py的配置文件,寫入
DEBUG = True
- 然后在你的app.py文件中寫入
app.config.from_object(config) #即可讀取配置文件中的DEBUG=True

debug PIN碼

D:MyDevSoftInstallDirPython3python3.exe D:/myflask/base/base.py
* Restarting with stat
* Debugger is active!
* Debugger PIN: 177-952-649
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

然后在頁面上調(diào)試代碼的時(shí)候用到。
也是為了安全考慮。

配置文件兩種方式詳解

第一種方式:

在項(xiàng)目主路徑下創(chuàng)建config.py

DEBUG=True

然后在主項(xiàng)目里面去讀取config.py里面的配置:

from flask import Flask
import config
app = Flask(__name__)
app.config.from_object(config)

第二種方式:直接讀取文件的形式,也可以是普通的txt文件形式;這種方式不需要直接import config

在項(xiàng)目主路徑下創(chuàng)建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ò)),文件的后綴名不可少
url與視圖函數(shù)的映射

傳遞參數(shù):

傳遞參數(shù)的語法是/<參數(shù)類型:參數(shù)名稱>/,然后在視圖函數(shù)中也要定義同名的參數(shù)

參數(shù)的數(shù)據(jù)類型

string:只接受字符串,沒有任何“/或者”的文本

int:只接受整數(shù)

float:只接受浮點(diǎn)數(shù),整數(shù)都不行哈

path:和string類似,但是接受斜杠

uuid:只有接受符合uuid的字符赤岸,一般用作表的主鍵

any:可以指定多種路徑

接收用戶傳遞參數(shù)的方式:

使用path的方式(將參數(shù)嵌入到路徑中)

使用查詢字符串的形式 (也就是通過?key=value的形式傳遞的,只能通過request.args.get的方式來獲?。?/p>

如果頁面想要做SEO優(yōu)化的話,那么推薦使用path的形式,反之就是查詢字符串的形式
練習(xí)

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/")
def article_detail(article_id1):
    return "請(qǐng)求的文章是:%s" %article_id1
@app.route("/p2/")
def article_detail2(article_id2):
    return "請(qǐng)求的文章是:%s" %article_id2
@app.route("/p3/")
def article_detail3(article_id3):
    return "請(qǐng)求的文章是:%s" %article_id3
@app.route("/p4/")
def article_detail4(article_id4):
    return "請(qǐng)求的文章是:%s" %article_id4
# import uuid
# print(uuid.uuid4())
@app.route("/p5/") #數(shù)據(jù)的唯一性,長度較長,有損效率(一般在用戶表中使用)6a9221f6-afea-424a-a324-8ceaa5bdfc98
def article_detail5(article_id5):
    return "請(qǐng)求的文章是:%s" %article_id5
@app.route("/p6///")
def detail(url_path,id):
    if url_path == "blog":
        return "博客詳情 %s" %id
    else:
        return "用戶詳情 %s" %id
#通過問號(hào)形式傳遞參數(shù)
@app.route("/d/")
def d():
    wd = request.args.get("wd") #獲取瀏覽器傳遞參數(shù)
    return "通過查詢字符串的方式傳遞的參數(shù)是,%s"%wd #請(qǐng)求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

將視圖函數(shù)反轉(zhuǎn)回URL,跟app.route相反

URL的更新大于視圖函數(shù),所以在大規(guī)模項(xiàng)目中比較實(shí)用

* 基本使用

url_for的第一個(gè)參數(shù)是視圖函數(shù)的函數(shù)名對(duì)應(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//")
def my_list():
    return "my list"

為什么需要url_for?

如果將來要修改URL,但沒有修改URL對(duì)應(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/")
def my_list():
    return "my list"
@app.route("/detail//")
def detail():
    return "detail"
if __name__ == "__main__":
    app.run(debug=True)
自定義url轉(zhuǎn)換器

url的參數(shù)轉(zhuǎn)換成滿足自己需求的數(shù)據(jù)類型

自定義url轉(zhuǎn)換器的方式:

實(shí)現(xiàn)一個(gè)類,繼承BaseConverter

在自定義的類中重寫regex,也就是這個(gè)變量的正則表達(dá)式

將自定義的類映射到app.url_map.converters上。

實(shí)現(xiàn)用戶訪問/posts/a+b
to_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ī)號(hào)碼正則
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//")
def user(user_id):
    return "your user id is %d" %user_id
@app.route("/telephone//")
def my_tel(my_tel):
    return "your telephone number is %s"%my_tel
@app.route("/posts//")
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")
指定端口號(hào)

默認(rèn)是5000端口,修改端口如下

app.run(host="0.0.0.0",port=8899 )
ulr唯一

在定義URL的時(shí)候,盡量在url后面加/,原因如下:

如果不加/的話瀏覽器訪問這個(gè)url的時(shí)候會(huì)默認(rèn)加/,這樣的話就訪問不到了

搜索引擎會(huì)將不加/的url和加/的url是兩個(gè)不同的url,會(huì)將其誤解。

GET和POST請(qǐng)求

在網(wǎng)絡(luò)請(qǐng)求中有許多的請(qǐng)求方式,比如GET,POST,DELETE,PUT,常用的請(qǐng)求方式如下:

GET:也就是獲取服務(wù)器上的資源,不會(huì)修改服務(wù)器上的內(nèi)容。

POST:就是向服務(wù)器提交文件或者數(shù)據(jù),一般POST會(huì)對(duì)服務(wù)器的狀態(tài)產(chǎn)生影響。

關(guān)于參數(shù)傳遞:

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的方式請(qǐng)求url。如果想要設(shè)置自己的請(qǐng)求方式,那就要在methods中多傳遞一個(gè)請(qǐng)求方式的參數(shù)。
實(shí)例如下:
創(chuàng)建url_detail的項(xiàng)目,項(xiàng)目結(jié)構(gòu)如下:
├─url_detail.py
├─static
└─templates
   |_login.html

url_detail.py"

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")

templates/login.html




    
    Title


URL重定向

也就是從一個(gè)頁面跳轉(zhuǎn)到另一個(gè)頁面,也就是重新定位一個(gè)方向
分類:

永久性重定向:http的狀態(tài)碼是301,多用于舊的網(wǎng)址廢棄了要轉(zhuǎn)到一個(gè)新的網(wǎng)址,確保用戶的訪問。最經(jīng)典的就是jingdong.com

暫時(shí)性重定向:http的狀態(tài)碼是302,表示頁面暫時(shí)性被跳轉(zhuǎn),比如訪問一個(gè)需要權(quán)限的網(wǎng)址,如果當(dāng)前用戶沒有登錄,應(yīng)該重定向到登錄頁面。這種情況的話就是用暫時(shí)性重定向。

在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
關(guān)于響應(yīng)

視圖函數(shù)的返回值會(huì)被自動(dòng)轉(zhuǎn)換成一個(gè)響應(yīng)對(duì)象,flask的轉(zhuǎn)換邏輯如下:

如果返回的是一個(gè)合法的響應(yīng)對(duì)象,則直接返回

如果返回的是一個(gè)字符串,那么flask會(huì)重新創(chuàng)建一個(gè)werkzeug.wrappers.Response對(duì)象。Response會(huì)將該字符串作為主體,狀態(tài)碼為200,MIME的類型為text/html,然后返回給Response對(duì)象

如果返回的是一個(gè)元組,元組中的數(shù)據(jù)類型是response,status,headers,status會(huì)覆蓋默認(rèn)的200狀態(tài)碼,headers可以是一個(gè)字典或者列表。作為額外的消息頭

如果以上的條件都不滿足,flask會(huì)假設(shè)返回值是一個(gè)合法的WSGI應(yīng)用程序,并通過Response.force_type(rv,request.environ)轉(zhuǎn)換成一個(gè)請(qǐng)求對(duì)象。

自定義響應(yīng)

必須繼承自Response

實(shí)現(xiàn)類方法:force_type

必須指定app.response_class為你自定義的Response

如果視圖函數(shù)返回的數(shù)據(jù)既不是字符串,也不是元組,也不是Response對(duì)象,那么會(huì)將返回值傳給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對(duì)象才會(huì)調(diào)用
        :param response:
        :param environ:
        :return:
        """
        print response
        print type(response)
        if isinstance(response,dict):
            #jsonify除了將字典轉(zhuǎn)換成為json對(duì)象,還將對(duì)象封裝成了一個(gè)Response對(duì)象
            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")

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/41668.html

相關(guān)文章

  • flask基礎(chǔ)之一

    摘要:最經(jīng)典的就是了暫時(shí)性重定向的狀態(tài)碼是,表示頁面暫時(shí)性被跳轉(zhuǎn),比如訪問一個(gè)需要權(quán)限的網(wǎng)址,如果當(dāng)前用戶沒有登錄,應(yīng)該重定向到登錄頁面。作為額外的消息頭如果以上的條件都不滿足,會(huì)假設(shè)返回值是一個(gè)合法的應(yīng)用程序,并通過轉(zhuǎn)換成一個(gè)請(qǐng)求對(duì)象。 flask基礎(chǔ)之一 hello world #從flask這個(gè)包中導(dǎo)入Flask這個(gè)類 #Flask這個(gè)類是項(xiàng)目的核心,以后的很多操作都是基于這個(gè)類的對(duì)象...

    archieyang 評(píng)論0 收藏0
  • flask基礎(chǔ)之一

    摘要:最經(jīng)典的就是了暫時(shí)性重定向的狀態(tài)碼是,表示頁面暫時(shí)性被跳轉(zhuǎn),比如訪問一個(gè)需要權(quán)限的網(wǎng)址,如果當(dāng)前用戶沒有登錄,應(yīng)該重定向到登錄頁面。作為額外的消息頭如果以上的條件都不滿足,會(huì)假設(shè)返回值是一個(gè)合法的應(yīng)用程序,并通過轉(zhuǎn)換成一個(gè)請(qǐng)求對(duì)象。 flask基礎(chǔ)之一 hello world #從flask這個(gè)包中導(dǎo)入Flask這個(gè)類 #Flask這個(gè)類是項(xiàng)目的核心,以后的很多操作都是基于這個(gè)類的對(duì)象...

    AWang 評(píng)論0 收藏0
  • Flask開發(fā)記錄系列之一項(xiàng)目骨架

    第一步,完成項(xiàng)目骨架。 https://github.com/xbynet/flask-skeleton backend all the requirements show the bellow: Flask==0.11.1 Werkzeug==0.11.11 Jinja2==2.8 SQLAlchemy==1.1.2 celery==3.1.23 Flask-sqlalchemy==2.1 f...

    xiaoqibTn 評(píng)論0 收藏0
  • Python到底能做什么?

    摘要:數(shù)據(jù)科學(xué)包括機(jī)器學(xué)習(xí),數(shù)據(jù)分析和數(shù)據(jù)可視化首先,機(jī)器學(xué)習(xí)是什么解釋機(jī)器學(xué)習(xí)的最佳方法是給你一個(gè)簡單的例子。機(jī)器學(xué)習(xí)算法的工作方式大致相同。這是一個(gè)人們競爭為特定問題構(gòu)建最佳機(jī)器學(xué)習(xí)算法的網(wǎng)站。 showImg(https://segmentfault.com/img/remote/1460000018887722); 來源 | 愿碼(ChainDesk.CN)內(nèi)容編輯 愿碼Sloga...

    Lionad-Morotar 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<