最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Python的flask相關(guān)知識(shí)點(diǎn)有哪些

這篇文章主要講解了“Python的flask相關(guān)知識(shí)點(diǎn)有哪些”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Python的flask相關(guān)知識(shí)點(diǎn)有哪些”吧!

成都創(chuàng)新互聯(lián)主要企業(yè)基礎(chǔ)官網(wǎng)建設(shè),電商平臺(tái)建設(shè),移動(dòng)手機(jī)平臺(tái),小程序定制開發(fā)等一系列專為中小企業(yè)定制網(wǎng)站制作產(chǎn)品體系;應(yīng)對(duì)中小企業(yè)在互聯(lián)網(wǎng)運(yùn)營的各種問題,為中小企業(yè)在互聯(lián)網(wǎng)的運(yùn)營中保駕護(hù)航。

一、flask

a、Flask是一個(gè)基于Python開發(fā)并且依賴jinja2模板和Werkzeug WSGI服務(wù)的一個(gè)微型框架,對(duì)于Werkzeug本質(zhì)是Socket服務(wù)端,其用于接收http請(qǐng)求并對(duì)請(qǐng)求進(jìn)行預(yù)處理,然后觸發(fā)Flask框架,開發(fā)人員基于Flask框架提供的功能對(duì)請(qǐng)求進(jìn)行相應(yīng)的處理,并返回給用戶,如果要返回給用戶復(fù)雜的內(nèi)容時(shí),需要借助jinja2模板來實(shí)現(xiàn)對(duì)模板的處理,即:將模板和數(shù)據(jù)進(jìn)行渲染,將渲染后的字符串返回給用戶瀏覽器

b、“微”(micro) 并不表示你需要把整個(gè) Web 應(yīng)用塞進(jìn)單個(gè) Python 文件(雖然確實(shí)可以 ),也不意味著 Flask 在功能上有所欠缺。微框架中的“微”意味著 Flask 旨在保持核心簡(jiǎn)單而易于擴(kuò)展。Flask 不會(huì)替你做出太多決策——比如使用何種數(shù)據(jù)庫。而那些 Flask 所選擇的——比如使用何種模板引擎——?jiǎng)t很容易替換。除此之外的一切都由可由你掌握。如此,F(xiàn)lask 可以與您珠聯(lián)璧合。

c、默認(rèn)情況下,F(xiàn)lask 不包含數(shù)據(jù)庫抽象層、表單驗(yàn)證,或是其它任何已有多種庫可以勝任的功能。然而,F(xiàn)lask 支持用擴(kuò)展來給應(yīng)用添加這些功能,如同是 Flask 本身實(shí)現(xiàn)的一樣。眾多的擴(kuò)展提供了數(shù)據(jù)庫集成、表單驗(yàn)證、上傳處理、各種各樣的開放認(rèn)證技術(shù)等功能。Flask 也許是“微小”的,但它已準(zhǔn)備好在需求繁雜的生產(chǎn)環(huán)境中投入使用。

d、視頻講解

二、安裝

  a、安裝:pip3 install flask

視頻講解

三、虛擬環(huán)境

  a、安裝: pip3 install virtualenv

  b、# 創(chuàng)建虛擬環(huán)境 virtualenv env1

  c、# 進(jìn)入虛擬環(huán)境 Scripts/activate

  d、 # 退出虛擬環(huán)境 Scripts/deactivate

四、flask框架

  a、簡(jiǎn)介:輕量級(jí)框架
                 Django:無socket、中間件、路由系統(tǒng)、視圖(CBV,F(xiàn)BV)、 模板、ORM、cookie、Session、Admin、Form、緩存、信號(hào)、序列化....
                 Flask:無socket、中間件(擴(kuò)展)、路由系統(tǒng)、視圖(CBV)、第三方模板(jinja2)、cookie、Session弱爆了

  b、 什么是wsgi?
                 Web服務(wù)網(wǎng)管接口,協(xié)議。

  c、Flask依賴一個(gè)實(shí)現(xiàn)了WSGI協(xié)議的模塊:werkzeug

五、flask

   a、 -依賴于wsgi模塊:wsgiref,werkzeug,wsgi

   b、  -實(shí)例化Flask對(duì)象

              -靜態(tài)文件前綴  /xxx

              -靜態(tài)文件目錄

              -模板路徑

    c、 添加路由關(guān)系      

              -將 Rule(url和視圖函數(shù))添加到Flask對(duì)象的url_map字段中

              -兩種添加路由的方式

    d、request

             -request.form

             -request.args 

六、基本使用

from flask import Flask

# 實(shí)例化Flask對(duì)象
app = Flask(__name__)

# 生成路由關(guān)系,并把關(guān)系保存到某個(gè)地方,app對(duì)象的 url_map字段中
@app.route('/xxxx')  # @decorator
def index():
    return "Index"

# def index():
#     return "Index"
# app.add_url_rule('/xxx', "n1", index)

if __name__ == '__main__':
    # 啟動(dòng)程序,監(jiān)聽用戶請(qǐng)求
    # 一旦請(qǐng)求到來,執(zhí)行 app.__call__方法
    # 封裝用戶請(qǐng)求
    # 進(jìn)行路由匹配
    app.run()

a、保存session的數(shù)據(jù)存到了瀏覽器上,    - 優(yōu)點(diǎn):減輕了服務(wù)端的壓力    - 缺點(diǎn):不安全

b、路由系統(tǒng):

@app.route('/post/path:path') @app.route('/login', methods=['GET', 'POST']) @app.route('/user/') @app.route('/post/int:post_id') @app.route('/post/float:post_id')

七、路由系統(tǒng) a、 -可傳入?yún)?shù)

        @app.route('/user/')

        @qpp.route('/post/',methods=['GET','POST'],endpoint='fff')

b、反向生成URL:url_for

c、擴(kuò)展Flask的路由系統(tǒng),讓它支持正則:

from flask import Flask,url_for

                app = Flask(__name__)

                # 定義轉(zhuǎn)換的類
                from werkzeug.routing import BaseConverter
                class RegexConverter(BaseConverter):
                    """
                    自定義URL匹配正則表達(dá)式
                    """

                    def __init__(self, map, regex):
                        super(RegexConverter, self).__init__(map)
                        self.regex = regex

                    def to_python(self, value):
                        """
                        路由匹配時(shí),匹配成功后傳遞給視圖函數(shù)中參數(shù)的值
                        :param value: 
                        :return: 
                        """
                        return int(value)

                    def to_url(self, value):
                        """
                        使用url_for反向生成URL時(shí),傳遞的參數(shù)經(jīng)過該方法處理,返回的值用于生成URL中的參數(shù)
                        :param value: 
                        :return: 
                        """
                        val = super(RegexConverter, self).to_url(value)
                        return val

                # 添加到converts中
                app.url_map.converters['xxx'] = RegexConverter

                # 進(jìn)行使用
                @app.route('/index/',endpoint='xx')
                def index(nid):
                    url_for('xx',nid=123)
                    return "Index"

                if __name__ == '__main__':
                    app.run()

八、請(qǐng)求響應(yīng)

from flask import Flask
    from flask import request
    from flask import render_template
    from flask import redirect
    from flask import make_response

    app = Flask(__name__)


    @app.route('/login.html', methods=['GET', "POST"])
    def login():

        # 請(qǐng)求相關(guān)信息
        # request.method
        # request.args
        # request.form
        # request.values
        # request.cookies
        # request.headers
        # request.path
        # request.full_path
        # request.script_root
        # request.url
        # request.base_url
        # request.url_root
        # request.host_url
        # request.host
        # request.files
        # obj = request.files['the_file_name']
        # obj.save('/var/www/uploads/' + secure_filename(f.filename))

        # 響應(yīng)相關(guān)信息
        # return "字符串"
        # return render_template('html模板路徑',**{})
        # return redirect('/index.html')

        # response = make_response(render_template('index.html'))
        # response是flask.wrappers.Response類型
        # response.delete_cookie('key')
        # response.set_cookie('key', 'value')
        # response.headers['X-Something'] = 'A value'
        # return response


        return "內(nèi)容"

    if __name__ == '__main__':
        app.run()

a、在django中用make_safe而在Flask中用make_response

九、模板語言

 a、模板的使用

           Flask使用的是Jinja2模板,所以其語法和Django無差別

 b、自定義模板方法

           Flask中自定義模板方法的方式和Bottle相似,創(chuàng)建一個(gè)函數(shù)并通過參數(shù)的形式傳入render_template,

十、session

  a、 -session是否還有其他方法?

                 -它與字典方法相同

  b、  -session超時(shí)時(shí)間如何設(shè)置:
app.config['SESSION_COOKIE_NAME'] = 'session_lvning'
            """
            'SESSION_COOKIE_NAME':                  'session',
            'SESSION_COOKIE_DOMAIN':                None,
            'SESSION_COOKIE_PATH':                  None,
            'SESSION_COOKIE_HTTPONLY':              True,
            'SESSION_COOKIE_SECURE':                False,
            'SESSION_REFRESH_EACH_REQUEST':         True,
            'PERMANENT_SESSION_LIFETIME':           timedelta(days=31)

c、除請(qǐng)求對(duì)象之外,還有一個(gè) session 對(duì)象。它允許你在不同請(qǐng)求間存儲(chǔ)特定用戶的信息。它是在 Cookies 的基礎(chǔ)上實(shí)現(xiàn)的,并且對(duì) Cookies 進(jìn)行密鑰簽名要使用會(huì)話,你需要設(shè)置一個(gè)密鑰。

設(shè)置:session['username'] = 'xxx'

刪除:session.pop('username', None)

十一、閃現(xiàn)(flash)

 a、session從在在服務(wù)端的一個(gè)字典中,session保存的數(shù)據(jù)取一次,它還是會(huì)有。而flash是基于session創(chuàng)建的,flash支持在里面放值,只要在里面取值它就會(huì)沒有。閃現(xiàn)就是

 b、在session的基礎(chǔ)上,把它的值真實(shí)的放在session上,當(dāng)去它的時(shí)候不僅把它的值取走,還把session的東西去掉。

十二、藍(lán)圖

 a、藍(lán)圖用于為應(yīng)用提供目錄劃分

藍(lán)圖URL前綴:xxx = Blueprint('account', name,url_prefix='/xxx') 藍(lán)圖子域名:xxx = Blueprint('account', name,subdomain='admin')

前提需要給配置SERVER_NAME: app.config['SERVER_NAME'] = 'wupeiqi.com:5000'

訪問時(shí):admin.wupeiqi.com:5000/login.html

十三、DBUtils

  a、DBUtils是Python的一個(gè)用于實(shí)現(xiàn)數(shù)據(jù)庫連接池的模塊。

  b、連接池的三種模式:

        (1)、第一種模式:

                             它的缺點(diǎn):每一次請(qǐng)求反復(fù)創(chuàng)建數(shù)據(jù)庫的鏈接,鏈接的次數(shù)太多

         (2)、第二種模式:

                             它的缺點(diǎn):不能支持并發(fā)

          (3)、第三種模式:

                            它是基于DBUtils實(shí)現(xiàn)數(shù)據(jù)庫連接池

                                    -為每個(gè)線程創(chuàng)建一個(gè)鏈接,該線程關(guān)閉時(shí),不是真正的關(guān)閉,本線程再次調(diào)用時(shí),還是使用的最開始的創(chuàng)建的鏈接,知道線程終止,數(shù)據(jù)庫鏈接才關(guān)閉

                                   -創(chuàng)建一個(gè)連接池(10個(gè)鏈接),為所有線程提供鏈接,使用時(shí)來進(jìn)行獲取,使用完畢時(shí),再次放回到連接池。

   c、DBUtils的應(yīng)用:
import time
import pyMySQL
import threading
from DBUtils.PooledDB import PooledDB, SharedDBConnection
POOL = PooledDB(
    creator=pymysql,  # 使用鏈接數(shù)據(jù)庫的模塊
    maxconnections=6,  # 連接池允許的最大連接數(shù),0和None表示不限制連接數(shù)
    mincached=2,  # 初始化時(shí),鏈接池中至少創(chuàng)建的空閑的鏈接,0表示不創(chuàng)建
    maxcached=5,  # 鏈接池中最多閑置的鏈接,0和None不限制
    maxshared=3,  # 鏈接池中最多共享的鏈接數(shù)量,0和None表示全部共享。PS: 無用,因?yàn)閜ymysql和MySQLdb等模塊的 threadsafety都為1,所有值無論設(shè)置為多少,_maxcached永遠(yuǎn)為0,所以永遠(yuǎn)是所有鏈接都共享。
    blocking=True,  # 連接池中如果沒有可用連接后,是否阻塞等待。True,等待;False,不等待然后報(bào)錯(cuò)
    maxusage=None,  # 一個(gè)鏈接最多被重復(fù)使用的次數(shù),None表示無限制
    setsession=[],  # 開始會(huì)話前執(zhí)行的命令列表。如:["set datestyle to ...", "set time zone ..."]
    ping=0,
    # ping MySQL服務(wù)端,檢查是否服務(wù)可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123',
    database='pooldb',
    charset='utf8'
)

十四、session

  a、 session和cookie的原理和區(qū)別:

           cookie是保存在瀏覽器上的鍵值對(duì)
           session是存在服務(wù)端的鍵值對(duì)(服務(wù)端的session就是一個(gè)大字典,字典中是隨機(jī)字符串)(session與request原理相同)(session原理跟上下文也有關(guān)系)

           session依賴于cookie存在

  b、  session流程
當(dāng)請(qǐng)求第一次進(jìn)來,生成隨機(jī)字符串
                  -發(fā)給用戶cookie
                  -保存到session字典中時(shí)
                  它調(diào)用stark將隨機(jī)字符串和對(duì)應(yīng)的值放到local
                視圖函數(shù)
                 -使用時(shí)導(dǎo)入用top(它拿的是session)
                     session=LocalProxy(partile(_lookup_req_object,'session '))
               請(qǐng)求處理完畢:
                     內(nèi)存處理完畢后,將session做持久化(session存到數(shù)據(jù)庫,存到redis,存到加密的cookie中)

十五、session源碼解析

a、先執(zhí)行Flask的__call__方法 ,調(diào)用出來wsgi_app,它先做request的上下文做完,請(qǐng)求剛進(jìn)來到push中,它先處理request將請(qǐng)求相關(guān)的數(shù)據(jù),然后添加到了local中,

b、 緊接著處理session(將RequestContext對(duì)象(request,session)添加到local中),request(將request信息封裝到Request(environ)對(duì)象并復(fù)制給requestContext 對(duì) 象),然后獲取cookie中的隨機(jī)字符串,檢驗(yàn)是否有,沒有就生成。根據(jù)隨機(jī)字符串,獲取服務(wù)端session保存的值。把session放到內(nèi)存中,

c、 執(zhí)行wsgi_app方法下面的視圖函數(shù)。執(zhí)行完視圖函數(shù)返回到full_dispatch_requesthong ,觸發(fā)只執(zhí)行一次的裝飾器中(觸發(fā)Flask信號(hào)),

d、 執(zhí)行完這個(gè)裝飾器,緊接著執(zhí)行下面的特殊的裝飾器,如果這些特殊裝飾器沒有返回值,那么rv=None,如果有返回值,頁面時(shí)就顯示這個(gè)返回值,

e、如果沒有返回值,觸發(fā)執(zhí)行那個(gè)視圖函數(shù),拿返回值。請(qǐng)求執(zhí)行完返回后,調(diào)用finalize_request,對(duì)它的返回值進(jìn)行封裝。

十六、Flask和Django的區(qū)別 

 a、請(qǐng)求相關(guān)的數(shù)據(jù)           

              -Django:參數(shù)

              -Flask:    基于Local,LocalStark對(duì)象

 b、 多個(gè)請(qǐng)求進(jìn)來會(huì)不會(huì)混淆            

              -單線程

              -多線程

              -協(xié)程

                解決: from greenlet import getcurrent as get_ident

十七、Flask信號(hào)

a、 Flask框架中的信號(hào)基于blinker

b、安裝: pip3 install blinker

c、十個(gè)信號(hào)

1. 內(nèi)置信號(hào)
            10個(gè)信號(hào):
                2. request_started = _signals.signal('request-started')                # 請(qǐng)求到來前執(zhí)行
                5. request_finished = _signals.signal('request-finished')              # 請(qǐng)求結(jié)束后執(zhí)行
                 
                3. before_render_template = _signals.signal('before-render-template')  # 模板渲染前執(zhí)行
                4. template_rendered = _signals.signal('template-rendered')            # 模板渲染后執(zhí)行
                 
                2/3/4/5或不執(zhí)行 got_request_exception = _signals.signal('got-request-exception')    # 請(qǐng)求執(zhí)行出現(xiàn)異常時(shí)執(zhí)行
                 
                6. request_tearing_down = _signals.signal('request-tearing-down')      # 請(qǐng)求執(zhí)行完畢后自動(dòng)執(zhí)行(無論成功與否)
                7. appcontext_tearing_down = _signals.signal('appcontext-tearing-down')# 請(qǐng)求上下文執(zhí)行完畢后自動(dòng)執(zhí)行(無論成功與否)
                 
                 
                1. appcontext_pushed = _signals.signal('appcontext-pushed')            # 請(qǐng)求app上下文push時(shí)執(zhí)行
                
                8. appcontext_popped = _signals.signal('appcontext-popped')            # 請(qǐng)求上下文pop時(shí)執(zhí)行
                
                message_flashed = _signals.signal('message-flashed')                   # 調(diào)用flask在其中添加數(shù)據(jù)時(shí),自動(dòng)觸發(fā)

d、flask信號(hào)本生自己沒有,用的是別人的,并且這些信號(hào)通過裝飾器全部可以代替了的,但是Django里面有些特殊的 就是那些model操作根本沒有裝飾器,就是同過內(nèi)置的信號(hào)來完成的

十八、django內(nèi)置的信號(hào)

Request/response signals
                    request_started             # 請(qǐng)求到來前,自動(dòng)觸發(fā)
                    request_finished            # 請(qǐng)求結(jié)束后,自動(dòng)觸發(fā)
                    got_request_exception       # 請(qǐng)求異常后,自動(dòng)觸發(fā)
                
                Model signals
                    pre_init                    # django的modal執(zhí)行其構(gòu)造方法前,自動(dòng)觸發(fā)
                    post_init                   # django的modal執(zhí)行其構(gòu)造方法后,自動(dòng)觸發(fā)
                    
                    pre_save                    # django的modal對(duì)象保存前,自動(dòng)觸發(fā)
                    post_save                   # django的modal對(duì)象保存后,自動(dòng)觸發(fā)
                    
                    pre_delete                  # django的modal對(duì)象刪除前,自動(dòng)觸發(fā)
                    post_delete                 # django的modal對(duì)象刪除后,自動(dòng)觸發(fā)
                    
                    m2m_changed                 # django的modal中使用m2m字段操作第三張表(add,remove,clear)前后,自動(dòng)觸發(fā)
                    
                    class_prepared              # 程序啟動(dòng)時(shí),檢測(cè)已注冊(cè)的app中modal類,對(duì)于每一個(gè)類,自動(dòng)觸發(fā)
                    
                Management signals
                    pre_migrate                 # 執(zhí)行migrate命令前,自動(dòng)觸發(fā)
                    post_migrate                # 執(zhí)行migrate命令后,自動(dòng)觸發(fā)
                
                Test signals
                    setting_changed             # 使用test測(cè)試修改配置文件時(shí),自動(dòng)觸發(fā)
                    template_rendered           # 使用test測(cè)試渲染模板時(shí),自動(dòng)觸發(fā)
                Database Wrappers
                    connection_created          # 創(chuàng)建數(shù)據(jù)庫連接時(shí),自動(dòng)觸發(fā)

十九、Wtform

a、WTForms是一個(gè)支持多個(gè)web框架的form組件,主要用于對(duì)用戶請(qǐng)求數(shù)據(jù)進(jìn)行驗(yàn)證。

b、安裝: pip3 install wtform

c、用途:

1、用戶登錄注冊(cè)

當(dāng)用戶登錄時(shí)候,需要對(duì)用戶提交的用戶名和密碼進(jìn)行多種格式校驗(yàn)。如:

用戶不能為空;用戶長(zhǎng)度必須大于6;
密碼不能為空;密碼長(zhǎng)度必須大于12;密碼必須包含 字母、數(shù)字、特殊字符等(自定義正則);
 app.py
 login

二十、SQLALchemy

a、介紹 :

       SQLALchemy是一個(gè)基于Python實(shí)現(xiàn)的ORM框架。該框架是建立在DB API之上,使用關(guān)系對(duì)象映射進(jìn)行數(shù)據(jù)庫操作

       簡(jiǎn)言之便就是:將類和對(duì)象轉(zhuǎn)換成SQL,然后使用數(shù)據(jù)API執(zhí)行SQL并獲取執(zhí)行的結(jié)果

b、安裝: pip3 install SQLALchemy

c、組成部分

 engine,                                     框架的引擎

     Connection  Pooling  ,                      數(shù)據(jù)庫連接池

     Dialect,                                    選擇鏈接數(shù)據(jù)庫的DB  API種類

     Schema /Types,                              架構(gòu)和類型     

     SQL Exprression Language,                   SQL表達(dá)式語言

d、SQLALcheam本省無法操作數(shù)據(jù)庫,其必須來pymysql等第三方插件, Dialect用于數(shù)據(jù)API的交流,根據(jù)配置文件的不同

調(diào)用不同的數(shù)據(jù)庫API,從而實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的操作

MySQL-Python
    mysql+mysqldb://:@[:]/
    
pymysql
    mysql+pymysql://:@/[?]
    
MySQL-Connector
    mysql+mysqlconnector://:@[:]/
    
cx_Oracle
    oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]
    
更多:http://docs.sqlalchemy.org/en/latest/dialects/index.html

感謝各位的閱讀,以上就是“Python的flask相關(guān)知識(shí)點(diǎn)有哪些”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Python的flask相關(guān)知識(shí)點(diǎn)有哪些這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!


網(wǎng)頁名稱:Python的flask相關(guān)知識(shí)點(diǎn)有哪些
文章來源:http://fisionsoft.com.cn/article/peicdd.html