亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

Flask介紹

對于Flask大家很熟悉了,現(xiàn)在主流Python的web框架,除了Django就數(shù)Flask了。

Django不用多說,集合了orm、template模板引擎、后臺管理系統(tǒng)、參數(shù)驗(yàn)證、路由系統(tǒng)、用戶認(rèn)證和其他一些工具的,方便快速建站,主要構(gòu)建了ORM和復(fù)寫ADMIN模塊,就可以快速生成網(wǎng)站和后臺增上改查和一些其他的定制化開發(fā)。

Flask是一個輕量級的可定制框架,使用Python語言編寫,較其他同類型框架更為靈活、輕便、安全且容易上手。它可以很好地結(jié)合MVC模式進(jìn)行開發(fā),開發(fā)人員分工合作,小型團(tuán)隊在短時間內(nèi)就可以完成功能豐富的中小型網(wǎng)站或Web服務(wù)的實(shí)現(xiàn)。另外,F(xiàn)lask還有很強(qiáng)的定制性,用戶可以根據(jù)自己的需求來添加相應(yīng)的功能,在保持核心功能簡單的同時實(shí)現(xiàn)功能的豐富與擴(kuò)展,其強(qiáng)大的插件庫可以讓用戶實(shí)現(xiàn)個性化的網(wǎng)站定制,開發(fā)出功能強(qiáng)大的網(wǎng)站。

筆者更傾向于Flask這個框架,因?yàn)樗油该鳎苷瓶仨?xiàng)目的質(zhì)量。

使用過的插件

Flask的插件管理是一個很不錯的特性,我們利用它可以在啟動web服務(wù)之前加載我們所需要的插件,一下是筆者經(jīng)常用到的:

  • flask-restful

flask的restapi開發(fā)框架,有參數(shù)校驗(yàn),路由攔截等功能。

  • flask-sqlalchemy

Sqlalchemy的flask插件,這個插件作者擴(kuò)展了針對與session中的query的分頁功能,可以使用SQLALCHEMY_BINDS進(jìn)行多個數(shù)據(jù)庫的綁定,可以配置連接池,連接池過期時間。

  • MySQLclient或者pymysql

Sqlalchemy連接mysql的引擎,不過pymysql需要加入一句話:

  import pymysql
  pymysql.install_as_MySQLdb()
  • marshmallow

Sqlalcemy序列化數(shù)據(jù)利器,可以使用它針對query返回的QuerySet結(jié)果集合進(jìn)行序列化成dict 數(shù)據(jù)。

  • flask-cors

開發(fā)API會遇到跨域訪問的問題,可以就是客戶端OPTIONS的請求,先探知服務(wù)器允不允許跨域訪問,允許會返回header中允許那些方法進(jìn)行請求服務(wù)器(GET、POST、DELETE、PUT等),這個插件可以通過簡單的配置,讓您的服務(wù)允許跨域訪問,不過在生產(chǎn)環(huán)境,還是推薦使用Nginx的好,能夠使用lua語言進(jìn)行更加嚴(yán)格的控制。

  • flask-login或者flask-jwt-extended

這兩個都是用戶認(rèn)證用到的插件,使用session控制,選擇flask-login,使用jwt使用flask-jwt-extended。

Flask框架

下面簡單說一下flask的框架,flask框架是基于Werkzeug和Jinja2兩大基礎(chǔ)框架,Werkzeug是基于WSGI協(xié)議的框架,已經(jīng)有了基本的路由、數(shù)據(jù)結(jié)構(gòu)、請求和響應(yīng)等功能,在此之上Flask擴(kuò)展了一些特性:

  • request

Flask利用Werkzeug的Local、LocalStack和LocalProxy,實(shí)現(xiàn)了AppContext和RequestContext的線程或者協(xié)程安全功能,也就是:

  1. 當(dāng)請求過來,F(xiàn)lask將app_context和request,這兩個對象壓入一個線程號或者協(xié)程號對應(yīng)的棧中,說白了就是dict字典,線程或者攜程號有g(shù)et_indent內(nèi)置方法獲得
  2. 請求過程中,由棧彈出上次壓入棧中的app_context和request
  3. 請求結(jié)束釋放空間

另外說明flask-sqlalchemy利用線程或者攜程號有g(shù)et_indent,可以使用scope_session功能,將session隔離,它是線程或者協(xié)程安全的,也和flask的請求保持一致。

  • endpoint

使得每個view方法,有個名稱,這個名稱是唯一的,它能夠通過這個名稱找到這個視圖方法,也就能夠獲得路由。

這里數(shù)據(jù)結(jié)構(gòu)簡單地說就是一個map類型,一個名稱唯一對應(yīng)一個視圖方法,不允許相同的endpoint出現(xiàn),這個應(yīng)用在使用url_for這個方法上:

  1. 程序中使用url_for進(jìn)行路由跳轉(zhuǎn)
  2. template模板總是用url_for查找對應(yīng)的路由

這樣可以靈活根據(jù)名稱去使用路由,而不是硬編碼到程序中非常死板,如果說我們修改了一個url的地址,只是微小的修改,其他引用這個路由的地方也需要修改,我們可能忘記了使用它的地方,這時url_for非常好的解決了這個問題。

  • extentions

擴(kuò)展應(yīng)用,提供了兩種方式,一種是直接加載,之類用生成對象例如CORS(flask_app),也可以懶加載,在創(chuàng)建應(yīng)用之前定義對象,創(chuàng)建flask_app時加載插件,例如flask-sqlalchemy

from flask import Flask
from flask_sqlalcemy import Sqlalchemy

db = Sqlalchemy()

def create_app():
    """
    創(chuàng)建Flask app
    """
    f_app = Flask()
    f_app.config.from_object("core.settings")
    db.init_app(app=f_app)
    return f_app

這樣的形式,我們可以使用全局這個db對象了。

開發(fā)項(xiàng)目目錄結(jié)構(gòu)

我們可以借鑒django的目錄形式進(jìn)行組織項(xiàng)目的框架,例如:

Flask框架及其應(yīng)用

 

core文件夾基本這個樣子,app 是項(xiàng)目Flask應(yīng)用初始化,settings是配置信息,應(yīng)用是user和config等,static存放靜態(tài)文件,templates是模板目錄,requirements.txt里面配置依賴,run.py是調(diào)試使用的啟動入口。

特別的一個應(yīng)用目錄為:

Flask框架及其應(yīng)用

 

其中,__init__.py是module的文件,dbis.py里面都是面向數(shù)據(jù)操作的方法,models.py里面都是ORM的定義,urls.py里面是路由配置,validators.py存放參數(shù)校驗(yàn)方法,views.py存放視圖方法,serializers.py存放序列化的方法,dbi_services.py存放構(gòu)造views.py中使用的數(shù)據(jù)類型。

我們?nèi)绾螌⑺麄兒虵lask的應(yīng)用聯(lián)系起來呢,可以進(jìn)行如下操作:

生成Flask的應(yīng)用代碼:

import os
from flask_sqlalchemy import SQLAlchemy
from flask_bootstrap import Bootstrap
from flask_url.conf import FlaskUrlConf
from flask_wtf.csrf import CSRFProtect
from flask import Flask

db = SQLAlchemy()


def create_app(import_name):
    """
    創(chuàng)建Flask應(yīng)用
    :param import_name: [str]  模塊名稱
    :return:
    """
    f_app = Flask(import_name)
    # 根據(jù)環(huán)境變量加載配置信息
    env_dict = {
        "DEV": "core.dev_settings",
        "ONLINE": "core.online_settings"
    }
    env = os.environ.get("PRO_ENV", "DEV")
    f_app.config.from_object(env_dict.get(env, "core.dev_settings"))
    FlaskUrlConf(app=f_app)
    db.init_app(app=f_app)
    CSRFProtect(app=f_app)
    print(f_app.url_map)
    return f_app


app = create_app(__name__)

其中使用了FlaskUrlConf(app=f_app)這個,是我自己構(gòu)造的一個插件,貼出這段代碼:

from flask import Flask
from flask.blueprints import Blueprint
from flask_url.utils import get_mod_attr


def path(rule, endpoint, view_func, **options):
    return Url(rule=rule, endpoint=endpoint, view_func=view_func, **options)


class Url:
    rule = None
    endpoint = None
    view_func = None
    options = {}

    def __init__(self, rule, endpoint, view_func, **options):
        self.rule = rule
        self.endpoint = endpoint
        self.view_func = view_func
        self.options = options


class FlaskUrlConf:

    def __init__(self, app: Flask = None):
        if app:
            self.init_app(app=app)

    def init_app(self, app: Flask):
        install_apps = app.config.get("INSTALL_APPS", [])
        for app_str in install_apps:
            mod_path = f"{app_str}.urls"
            try:
                urls = get_mod_attr(mod_path, "urls")
                b = Blueprint(import_name=mod_path, name=app_str)
                for url in urls:
                    if isinstance(url, Url):
                        b.add_url_rule(
                            rule=url.rule,
                            endpoint=url.endpoint,
                            view_func=url.view_func,
                            **url.options
                        )
                app.register_blueprint(b)
            except ImportError as e:
                app.logger.warn(f"Import module {mod_path} err {e}")
            except IndexError as e:
                app.logger.warn(f"Split module {mod_path} attr error {e}")
            except AttributeError as e:
                app.logger.warn(f"Get attr from url module {mod_path}, error {e}")

其核心思想是通過INSTALL_APPS這個配置,將各級模塊兒應(yīng)用下的urls.py中的urls列表進(jìn)行加載,urls.py示例:

from flask_url.conf import path
from article import views


urls = [
    path(rule="/article/page/<int:a_id>/", view_func=views.get_article, endpoint="page")
]

那我們就完成了MVC的項(xiàng)目目錄結(jié)構(gòu)的搭建。

部署

最后我們再來談一下flask應(yīng)用的部署,我們可以使用gunicorn或者uwsgi進(jìn)行部署,通過nginx進(jìn)行代理即可。

uwsgi配置示例:

uwsgi]
uid = root
gid = root

master = true
processes = 1
listen = 10
socket = 127.0.0.1:9000
pidfile = /uwsgi.pid	# 你的路徑
vacuum = true
daemonize = /uwsgi.log # 你的日志路徑
chdir = ${你的項(xiàng)目路徑}
home=${你的env的路徑}
buffer-size = 32768  # 可以修改允許最大交換數(shù)據(jù)
module = core.wsgi  # 你的 wsgi模塊路徑
callable = app # 選擇你的應(yīng)用,F(xiàn)lask的應(yīng)用
http-websockets = true # 是否啟用web socket
gevent = 10   # 啟用協(xié)程
async = 10   

nginx配置示例

server {
        listen       8888;
        charset UTF-8;


        location ^~ /api/ {
                include uwsgi_params;
                uwsgi_pass http://127.0.0.1:9000;
                client_max_body_size 100m;
        }
}

以上是總結(jié)的一些內(nèi)容跟大家分享,由于篇幅有限有些細(xì)節(jié)沒有說清,大家可以在評論區(qū)提問。希望大家多多支持。

分享到:
標(biāo)簽:框架 Flask
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定