欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Flask項(xiàng)目搭建及部署(最全教程)

 更新時(shí)間:2022年04月12日 09:55:46   作者:0世界和平0  
本文主要介紹了Flask項(xiàng)目搭建及部署,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

flask搭建及部署

  • pip 19.2.3
  • python 3.7.5
  • Flask 1.1.1
  • Flask-SQLAlchemy 2.4.1
  • Pika 1.1.0
  • Redis 3.3.11
  • flask-wtf 0.14.2

1、創(chuàng)建flask項(xiàng)目:

創(chuàng)建完成后整個(gè)項(xiàng)目結(jié)構(gòu)樹:

app.py: 項(xiàng)?管理?件,通過它管理項(xiàng)?。

static: 存放靜態(tài)文件

templates文件夾:用于放置html模板文件

由于flask屬于輕量級(jí)web框架, 更加自由、靈活,可擴(kuò)展性強(qiáng),第三方庫(kù)的選擇面廣,開發(fā)時(shí)可以結(jié)合自己最喜歡用的輪子,也能結(jié)合最流行最強(qiáng)大的Python庫(kù) 。所以這個(gè)框架的代碼架構(gòu)需要自己設(shè)計(jì)。

2、創(chuàng)建項(xiàng)目主要邏輯代碼保存目錄

手動(dòng)創(chuàng)建application目錄、filter目錄及其子目錄

application : 項(xiàng)目主要邏輯代碼保存目錄

_init_.py : 創(chuàng)建flask應(yīng)用并加載配置,如mysql,redis,rabbitmq,

apps : 專門用于保存每一個(gè)項(xiàng)目的藍(lán)圖

app1 : app1藍(lán)圖目錄,在app1下的init_.py中文件中創(chuàng)建藍(lán)圖對(duì)象,view.py中新增對(duì)應(yīng)的視圖文件,在 model.py中寫模型代碼

settings : 項(xiàng)目配置存儲(chǔ)目錄

dev.py : 項(xiàng)目開發(fā)階段配置文件

prop.py : 項(xiàng)目生成階段配置文件

static : 項(xiàng)目靜態(tài)文件夾(用于存放css一類的文件)

templates : 用于放置html模板文件

filter : 整個(gè)項(xiàng)目攔截器目錄

requestFilter.py: 針對(duì)整個(gè)app項(xiàng)目全局路由攔截規(guī)則定義

app.py : 項(xiàng)?管理?件,通過它啟動(dòng)整個(gè)項(xiàng)目

2.1 配置mysql數(shù)據(jù)庫(kù),加載配置文件并針對(duì)整個(gè)app項(xiàng)目定義全局db

2.1.1 settings.py

#全局通用配置類
class Config(object):
    """項(xiàng)目配置核心類"""
    #調(diào)試模式
    DEBUG=False
?
    # 配置日志
    # LOG_LEVEL = "DEBUG"
    LOG_LEVEL = "INFO"
?
?
    # 配置redis
    # 項(xiàng)目上線以后,這個(gè)地址就會(huì)被替換成真實(shí)IP地址,mysql也是
    REDIS_HOST = 'your host'
    REDIS_PORT = your port
    REDIS_PASSWORD = 'your password'
    REDIS_POLL = 10
?
    #數(shù)據(jù)庫(kù)連接格式
    SQLALCHEMY_DATABASE_URI = "mysql+pymysql://user:password@localhost:3306/test?charset=utf8"
    # 動(dòng)態(tài)追蹤修改設(shè)置,如未設(shè)置只會(huì)提示警告
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    # 查詢時(shí)會(huì)顯示原始SQL語(yǔ)句
    SQLALCHEMY_ECHO = False
    # 數(shù)據(jù)庫(kù)連接池的大小
    SQLALCHEMY_POOL_SIZE=10
    #指定數(shù)據(jù)庫(kù)連接池的超時(shí)時(shí)間
    SQLALCHEMY_POOL_TIMEOUT=10
    # 控制在連接池達(dá)到最大值后可以創(chuàng)建的連接數(shù)。當(dāng)這些額外的 連接回收到連接池后將會(huì)被斷開和拋棄。
    SQLALCHEMY_MAX_OVERFLOW=2
?
?
    #rabbitmq參數(shù)配置
    RABBITUSER="user"
    RABBITPASSWORD="password"
    RABBITHOST="your ip"
    RABBITPORT=your port

2.1.2 dev.py

from . import Config
?
class DevelopmentConfig(Config):
    '開發(fā)模式下的配置'
    # 查詢時(shí)會(huì)顯示原始SQL語(yǔ)句
    SQLALCHEMY_ECHO = True

2.1.3 prop.py

from . import Config
?
class ProductionConfig(Config):
    """生產(chǎn)模式下的配置"""
    DEBUG = False

2.1.4 加載配置文件,定義全局的db( SQLALchemy類的實(shí)例 )供項(xiàng)目使用

# 主應(yīng)用的根目錄
app = Flask(__name__)
?
config = {
    'dev': DevelopmentConfig,
    'prop': ProductionConfig,
}
?
# 設(shè)置配置類
Config = config['dev']
?
# 加載配置
app.config.from_object(Config)
?
# 創(chuàng)建數(shù)據(jù)庫(kù)連接對(duì)象
db = SQLAlchemy(app)

dev : 測(cè)試環(huán)境配置

prop: 生產(chǎn)環(huán)境配置

Flask應(yīng)用app配置加載

通常三種方式

  • 從配置對(duì)象中加載:app.config.from_object()
  • 從配置文件中加載:app.config.from_pyfile()-ini文件
  • 從環(huán)境變量中加載:app.config.from_envvar()

配置對(duì)象

從配置對(duì)象中加載,創(chuàng)建配置的類:

# 配置對(duì)象,里面定義需要給 APP 添加的一系列配置
class Config(object):
    DEBUG = True
?
?
app = Flask(__name__)
?
# 從配置對(duì)象中加載配置
app.config.from_object(Config)
app.run()

配置文件

從配置文件中加載,在目錄中定義一個(gè)配置文件config.ini

app = Flask(__name__)
?
# 從配置對(duì)象中加載配置
app.config.from_pyfile("config.ini")
app.run()

環(huán)境變量

app = Flask(__name__)
# 從環(huán)境變量中加載
app.config.from_envvar("FLASKCONFIG")
app.run()

2.2 定義model模型,負(fù)責(zé)和數(shù)據(jù)庫(kù)交互

app1.model

from application import db
?
class Wdtest(db.Model):
    __tablename__ = "wdtest" #設(shè)置表名
    id = db.Column(db.String(100), primary_key=True, comment="主鍵ID")
    name = db.Column(db.String(20), index=True, comment="姓名" )
    age = db.Column(db.Integer, default=True, comment="年齡")

模型 表示程序使用的持久化實(shí)體. 在Flask-SQLALchemy 中, 模型一般是一個(gè) Python 類, 類中的屬性對(duì)應(yīng)數(shù)據(jù)庫(kù)中的表.

db.Model :創(chuàng)建模型,

db.Column : 創(chuàng)建模型屬性.

tablename :指定表名

模型屬性類型 :

類型名Python類型說明
Integerint普通整數(shù),一般是 32 位
SmallIntegerint取值范圍小的整數(shù),一般是 16 位
Big Integerint 或 long不限制精度的整數(shù)
Floatfloat浮點(diǎn)數(shù)
Numericdecimal.Decimal定點(diǎn)數(shù)
Stringstr變長(zhǎng)字符串
Textstr變長(zhǎng)字符串,對(duì)較長(zhǎng)或不限長(zhǎng)度的字符串做了優(yōu)化
Unicodeunicode變長(zhǎng) Unicode 字符串
Unicode Textunicode變長(zhǎng) Unicode 字符串,對(duì)較長(zhǎng)或不限長(zhǎng)度的字符串做了優(yōu)化
Booleanbool布爾值
Datedatetime.date日期
Timedatetime.time時(shí)間
DateTimedatetime.datetime日期和時(shí)間
Intervaldatetime.timedelta時(shí)間間隔
Enumstr一組字符串
PickleType任何 Python 對(duì)象自動(dòng)使用 Pickle 序列化
LargeBinarystr二進(jìn)制文件

常用 SQLAlchemy 列選項(xiàng)

選項(xiàng)名說明
primary_key如果設(shè)為 True,這列就是表的主鍵
unique如果設(shè)為 True,這列不允許出現(xiàn)重復(fù)的值
index如果設(shè)為 True,為這列創(chuàng)建索引,提升查詢效率
nullable如果設(shè)為 True,這列允許使用空值;如果設(shè)為 False,這列不允許使用空值
default為這列定義默認(rèn)值

2.3 聲明藍(lán)圖

app1._init.py

#給app取別名為 'index'
index_blu=Blueprint('index',__name__,template_folder='templates',static_folder='static')
?
from .views import *

template_folder:指定模板文件路徑,查找順序,先全局templates里面找,沒找到,再往子藍(lán)圖里面找.

這里是把view中所有的視圖都聲明在index這個(gè)藍(lán)圖里面,接下來我們需要做的是將這個(gè)聲明好的藍(lán)圖,注冊(cè)進(jìn)我們的項(xiàng)目中。

2.4 將聲明好的藍(lán)圖注冊(cè)進(jìn)app中

application.init_:

from application.settings.dev import DevelopmentConfig
from application.settings.prop import ProductionConfig
?
# 主應(yīng)用的根目錄
app = Flask(__name__)
?
config = {
    'dev': DevelopmentConfig,
    'prop': ProductionConfig,
}
?
# 設(shè)置配置類
Config = config['dev']
?
# 加載配置
app.config.from_object(Config)
?
# 創(chuàng)建數(shù)據(jù)庫(kù)連接對(duì)象
db = SQLAlchemy(app)
?
# todo 注冊(cè)藍(lán)圖
from .apps.app1 import index_blu
app.register_blueprint(index_blu, url_prefix='/index')

針對(duì):app = Flask(name)解釋

Flask類初始化參數(shù)

Flask類init方法部分代碼

def __init__(
        self,
        import_name,
        static_url_path=None,
        static_folder="static",
        static_host=None,
        host_matching=False,
        subdomain_matching=False,
        template_folder="templates",
        instance_path=None,
        instance_relative_config=False,
        root_path=None,
    ):pass

import_name:Flask程序所在的包(模塊),傳 __name__

static_url_path:靜態(tài)文件訪問路徑,可以不傳,默認(rèn)為:/ + static_folder

static_folder:靜態(tài)文件存儲(chǔ)的文件夾,可以不傳,默認(rèn)為 static

template_folder:模板文件存儲(chǔ)的文件夾,可以不傳,默認(rèn)為 templates

3 通過以上的步驟后,我們可以基本操作數(shù)據(jù)庫(kù)了:

以下所有示例代碼,皆在view.py中去實(shí)現(xiàn)

3.1 增:

先寫怎么增,然后增加,最后提交

student = Wdtest(id=ids , name=name, age=age)
try:
    application.db.session.add(student)
    application.db.session.commit()
except:
    # 事務(wù)回滾
    application.db.session.rollback()

3.2 刪:

先獲取數(shù)據(jù)庫(kù)中的這個(gè)數(shù)據(jù),再刪除它

    user = Wdtest.query.first()
    application.db.session.delete(user)
    application.db.session.commit()

3.3 改:

user = Wdtest.query.first()
user.name = name
try:
    application.db.session.commit()
except:
    # 事務(wù)回滾
    application.db.session.rollback()

3.4 查:

# 查詢所有?戶數(shù)據(jù)
user_list=Wdtest.query.all()
?
# 查詢有多少個(gè)?戶
user_list_num=Wdtest.query.count()
# 查詢第1個(gè)?戶
user=Wdtest.query.first()
# 查詢id為3的?戶[3種?式]
user=Wdtest.query.get(3)  # 根據(jù)主鍵查詢
user_list=Wdtest.query.filter_by(id=3).all()  # 以關(guān)鍵字實(shí)參形式進(jìn)行匹配字段
user_list=Wdtest.query.filter(Wdtest.id == 3).all()  # 以恒等式形式匹配字段
?
# 查詢名字結(jié)尾字符為g的所有?戶
Wdtest.query.filter(Wdtest.name.endswith('g')).all()
?
# 查詢名字包含‘wa'的所有項(xiàng)目
user_list=Wdtest.query.filter(Wdtest.name.contains('wa')).all()
# 模糊查詢
user_list =Wdtest.query.filter(Wdtest.name.like('%a%')).all()
# 查詢名字wa開頭和age為20的所有?戶[2種?式]
user_list=Wdtest.query.filter(Wdtest.name.startswith('wa'),Wdtest.age == 20).all()
user_list=Wdtest.query.filter(and_(Wdtest.name.startswith('wa'), Wdtest.age == 20)).all()
?
# 非條件查詢查詢名字不等于wade的所有?戶[2種?式]
user_list=Wdtest.query.filter(not_(Wdtest.name == 'wade')).all()
user_list=Wdtest.query.filter(Wdtest.name != 'wade').all()
?
# in 條件查詢
user_list=Wdtest.query.filter(Wdtest.id.in_(['97124f50-0208-11ea-a66c-04ea56212bdf', '3'])).all()
?
# 所有?戶先按年齡從?到?, 再按id從?到?排序, 取前5個(gè)
user_list=Wdtest.query.order_by(Wdtest.age,Wdtest.id.desc()).limit(5).all()
?
# 分?查詢, 每?3個(gè), 查詢第2?的數(shù)據(jù)
pn = Wdtest.query.paginate(2,3)
print(pn.pages)
print(pn.page)
print(pn.items)

4 路由傳參

有時(shí)我們需要將同一類 URL 映射到同一個(gè)視圖函數(shù)處理,比如:使用同一個(gè)視圖函數(shù)來顯示不同用戶的個(gè)人信息。

# 路由傳遞參數(shù)
@app.route('/user/<id>')
def user_info(id):
    return '%s' % id

路由傳遞的參數(shù)默認(rèn)當(dāng)做 string 處理

####指定請(qǐng)求方式

在 Flask 中,定義一個(gè)路由,默認(rèn)的請(qǐng)求方式為:

  • GET
  • OPTIONS
  • HEAD

在裝飾器添加請(qǐng)求指定方式:

@app.route('/test', methods=['GET', 'POST'])
def test():
    return "ok"

5 動(dòng)態(tài)正則匹配路由

flask實(shí)現(xiàn)正則匹配步驟:

  • 導(dǎo)入轉(zhuǎn)換器基類:在 Flask 中,所有的路由的匹配規(guī)則都是使用轉(zhuǎn)換器對(duì)象進(jìn)行記錄
  • 自定義轉(zhuǎn)換器:自定義類繼承于轉(zhuǎn)換器基類
  • 添加轉(zhuǎn)換器到默認(rèn)的轉(zhuǎn)換器字典中
  • 使用自定義轉(zhuǎn)換器實(shí)現(xiàn)自定義匹配規(guī)則

實(shí)現(xiàn):

導(dǎo)入轉(zhuǎn)換器基類

from werkzeug.routing import BaseConverter

自定義轉(zhuǎn)換器

# 自定義正則轉(zhuǎn)換器
class RegexConverter(BaseConverter):
    def __init__(self, url_map, *args):
        super(RegexConverter, self).__init__(url_map)
        # 將接受的第1個(gè)參數(shù)當(dāng)作匹配規(guī)則進(jìn)行保存
        self.regex = args[0]

添加轉(zhuǎn)換器到默認(rèn)的轉(zhuǎn)換器字典中,并指定轉(zhuǎn)換器使用時(shí)名字為: re

app = Flask(__name__)
?
# 將自定義轉(zhuǎn)換器添加到轉(zhuǎn)換器字典中,并指定轉(zhuǎn)換器使用時(shí)名字為: regex
app.url_map.converters['regex'] = RegexConverter

使用轉(zhuǎn)換器去實(shí)現(xiàn)自定義匹配規(guī)則

當(dāng)前此處定義的規(guī)則是:3位數(shù)字

@app.route('/index/<regex("[0-9]{3}"):id>')
def user_info(id):
    return "id 為 %s" % id

自定義轉(zhuǎn)換器其他函數(shù)實(shí)現(xiàn)

繼承于自定義轉(zhuǎn)換器之后,還可以實(shí)現(xiàn) to_python 和 to_url 這兩個(gè)函數(shù)去對(duì)匹配參數(shù)做進(jìn)一步處理:

to_python:

  • 該函數(shù)參數(shù)中的 value 值代表匹配到的值,可輸出進(jìn)行查看
  • 匹配完成之后,對(duì)匹配到的參數(shù)作最后一步處理再返回,比如:轉(zhuǎn)成 int 類型的值再返回:
class RegexConverter(BaseConverter):
    def __init__(self, url_map, *args):
        super(RegexConverter, self).__init__(url_map)
        # 將接受的第1個(gè)參數(shù)當(dāng)作匹配規(guī)則進(jìn)行保存
        self.regex = args[0]
?
    def to_python(self, value):
        return int(value)

系統(tǒng)自帶轉(zhuǎn)換器

DEFAULT_CONVERTERS = {
    'default':          UnicodeConverter,
    'string':           UnicodeConverter,
    'any':              AnyConverter,
    'path':             PathConverter,
    'int':              IntegerConverter,
    'float':            FloatConverter,
    'uuid':             UUIDConverter,
}

6 增加日志記錄、redis配置加載、mq配置加載

6.1 日志記錄

Settings._init:

# 配置日志
# LOG_LEVEL = "DEBUG"
LOG_LEVEL = "INFO"

日志記錄級(jí)別

FATAL/CRITICAL = 致命的,危險(xiǎn)的
ERROR = 錯(cuò)誤
WARNING = 警告
INFO = 信息
DEBUG = 調(diào)試
NOTSET = 沒有設(shè)置

application._init:

1、日志模塊基礎(chǔ)配置,如:日志存放地址、日志記錄格式、日志等級(jí)

#增加日志模塊
def setup_log(Config):
    #設(shè)置日志等級(jí)
    logging.basicConfig(level=Config.LOG_LEVEL)
    # 創(chuàng)建日志記錄器,指明日志保存的路徑、每個(gè)日志文件的最大大小、保存的日志文件個(gè)數(shù)上限
    file_log_handler=RotatingFileHandler('log/log',maxBytes=1024 * 1024 * 300, backupCount=10)
    # 創(chuàng)建日志記錄的格式 日志等級(jí) 輸入日志信息的文件名 行數(shù) 日志信息
    formatter = logging.Formatter('%(asctime)s: %(levelname)s %(filename)s:%(lineno)d %(message)s')
    # 為剛創(chuàng)建的日志記錄器設(shè)置日志記錄格式
    file_log_handler.setFormatter(formatter)
    # 為全局的日志工具對(duì)象(flaskapp使用的)添加日志記錄器
    logging.getLogger().addHandler(file_log_handler)

2、日志啟動(dòng)

#日志啟動(dòng)
setup_log(Config)

6.2 redis配置及加載

之前我們?cè)赾onfig中已經(jīng)把redis的配置已經(jīng)寫進(jìn)去了,所以這里可以直接創(chuàng)redis連接池供app全局使用

application._init:

#新增redis連接模塊
def connectRedis(Config):
    pool = redis.ConnectionPool(host=Config.REDIS_HOST, port=Config.REDIS_PORT, password=Config.REDIS_PASSWORD,
                                max_connections=Config.REDIS_POLL)
    redis_store = redis.Redis(connection_pool=pool)
    return redis_store

使用示例:

@index_blu.route("/redis",methods=["POST","GET"])
def add_toRedis():
    logging.info("come to here")
    key = request.args.get("key")
    application.redis_store.set(key , "1233")
    value=application.redis_store.get( key )
    print(value)
    return "12333"

6.3 rabbitmq基礎(chǔ)配置及加載

# rabbitmq配置訪問
# 添加用戶名和密碼
credentials = pika.PlainCredentials(Config.RABBITUSER, Config.RABBITPASSWORD)
# 配置連接參數(shù)
parameters = pika.ConnectionParameters(host=Config.RABBITHOST, port=Config.RABBITPORT, credentials=credentials)
connection = pika.BlockingConnection(parameters)
channel = connection.channel()

使用示例:

@index_blu.route("/rabitmq",methods=["POST","GET"])
def add_rabitmq():
    logging.info("come to rabiitmq")
    application.channel.queue_declare(queue='queuetest2')
?
    return "33333"

7 全局?jǐn)r截器配置

filerter.requestFilter

這里只是簡(jiǎn)單針對(duì)請(qǐng)求路徑非index的進(jìn)行攔截,如果還有其他攔截條件或者機(jī)制,可以繼續(xù)在filter這個(gè)包下添加

from flask import request
import application
?
# 攔截器,每次的請(qǐng)求進(jìn)來都會(huì)做的操作
@application.app.before_request
def before_action():
    # 獲取當(dāng)前請(qǐng)求的路由(路徑)
    a = request.path
    print(a)
    u = a.split('/')
    if len(a)>2:
        if u[1] == 'index':
            print('success')
    else:
        return "無(wú)權(quán)限請(qǐng)求"

攔截器加載進(jìn)app:

#攔截器加載
requestFilter.before_action

8 請(qǐng)求對(duì)象request和返回對(duì)象Response

請(qǐng)求對(duì)象request,使用前先導(dǎo)入request模塊

from flask import request
  • 獲取url請(qǐng)求參數(shù):request.args
  • 獲取form表單中的數(shù)據(jù):request.form
  • 獲取請(qǐng)求體原始數(shù)據(jù):request.data
  • 獲取文件數(shù)據(jù):request.files
  • 獲取cookie:request.cookies
  • 獲取header信息:request.headers
  • 獲取請(qǐng)求方法:request.method
  • 獲取請(qǐng)求路徑:request.path

Response

視圖函數(shù)中可以返回的值

  • 可以直接返回字符串,底層將這個(gè)字符串封裝成了Response對(duì)象
  • 元組,響應(yīng)格式(響應(yīng)體,狀態(tài)碼,頭信息),不一定都要寫,底層也是封裝了一個(gè)Response對(duì)象
  • 返回Response或其子類(jsonify子類返回標(biāo)準(zhǔn)json)

實(shí)現(xiàn)一個(gè)自定義Response對(duì)象步驟

  • 繼承Response對(duì)象
  • 實(shí)現(xiàn)方法 force_typeforce_type(cls,rv,environ=None)
  • 指定app.response為你定義的類
  • 如果返回的值不是可以返回的對(duì)象,就會(huì)調(diào)用force_type方法

實(shí)現(xiàn)

class JSONResponse(Response):
?
    @classmethod
    def force_type(cls, response, environ=None):
        '''
        這個(gè)方法只有視圖函數(shù)返回非字符、非元祖、非Response對(duì)象才會(huì)調(diào)用
        :param response:是視圖函數(shù)的返回值
        :param environ:
        :return:
        '''
        print(response)
        print(type(response))
        if isinstance(response,(list,dict)):
?
            #jsonify除了將字典轉(zhuǎn)換成json對(duì)象,還將對(duì)象包裝成了一個(gè)Response對(duì)象
            response = jsonify(response)
?
        return super(JSONResponse,cls).force_type(response,environ) 
        
app.response_class = JSONResponse

9 異常捕獲及自定義異常

捕獲錯(cuò)誤

errorhandler 裝飾器

  • 注冊(cè)一個(gè)錯(cuò)誤處理程序,當(dāng)程序拋出指定錯(cuò)誤狀態(tài)碼的時(shí)候,就會(huì)調(diào)用該裝飾器所裝飾的方法

參數(shù):

  • code_or_exception – HTTP的錯(cuò)誤狀態(tài)碼或指定異常

例如統(tǒng)一處理狀態(tài)碼為500,404的錯(cuò)誤給用戶友好的提示:

@app.errorhandler(500)
def internal_server_error(e):
    return '服務(wù)器搬家了哈哈哈'
?
@app.errorhandler(404)
def internal_server_error(e):
    return '瞎請(qǐng)求什么路徑呢'

例如自定義錯(cuò)誤413

@app.errorhandler(413)
def zero_division_error(e):
    return '除數(shù)不能為0'

異常捕獲

abort 方法

  • 拋出一個(gè)給定狀態(tài)代碼的 HTTPException 或者 指定響應(yīng),例如想要用一個(gè)頁(yè)面未找到異常來終止請(qǐng)求,你可以調(diào)用 abort(404)。

參數(shù):

code – HTTP的錯(cuò)誤狀態(tài)碼

@index_blu.route("/exception",methods=["POST","GET"])
def exception():
    logging.info("come to exception")
    try:
        print(2)
        a=3/0
    except:
        abort(413)
    return "ooooo"

10 上下文

上下文:即語(yǔ)境,語(yǔ)意,在程序中可以理解為在代碼執(zhí)行到某個(gè)時(shí)刻,根據(jù)之前代碼鎖做的操作以及下文即將要執(zhí)行的邏輯,可以決定在當(dāng)前時(shí)刻下可以使用到的變量,或者可以做的事情。

Flask中有兩種上下文:請(qǐng)求上下文(request context)應(yīng)用上下文(application context)

Flask中上下文對(duì)象:相當(dāng)于一個(gè)容器,保存了Flask程序運(yùn)行過程中的一些信息。

1.application指的是當(dāng)你調(diào)用app = flask(name)創(chuàng)建的這個(gè)對(duì)象app。 2.request指的是每次http請(qǐng)求發(fā)生時(shí),WSGI server(比如gunicorn)調(diào)用Flask.call()之后,在Flask對(duì)象內(nèi)部創(chuàng)建的Request對(duì)象; 3.application表示用于相應(yīng)WSGI請(qǐng)求的應(yīng)用本身,request表示沒出http請(qǐng)求; 4.appliacation的生命周期大于request,一個(gè)application存活期間,可能發(fā)生多次http請(qǐng)求,所以,也就會(huì)有多個(gè)request;

請(qǐng)求上下文(request context):在Flask中,可以直接在視圖函數(shù)中使用request這個(gè)獨(dú)享進(jìn)行獲取先關(guān)數(shù)據(jù),而request就是請(qǐng)求上下文的對(duì)象,保存了當(dāng)前本次請(qǐng)求的相關(guān)數(shù)據(jù),請(qǐng)求上線文對(duì)象有:request、session

request:封裝了HTTP請(qǐng)求的內(nèi)容,針對(duì)的是http請(qǐng)求。例如:user = request.args.get('user'),獲取的是get請(qǐng)求的參數(shù)。

session:用來記錄請(qǐng)求會(huì)話中的信息,針對(duì)的是用戶信息。例如:session['name'] = user.id 科可以記錄用戶信息。還可以通過session.get('name')獲取用戶信息。

應(yīng)用上下文(application context):它不是一直存在的,它只是request context中的一個(gè)對(duì)app的代理,所謂的local proxy。它的作用主要是幫助request獲取當(dāng)前的應(yīng)用,它是伴request而生,隨request而滅的。

應(yīng)用上下文對(duì)象有:current_app,g

current_app:應(yīng)用程序上下文,用于存儲(chǔ)應(yīng)用程序中的變量,可以通過current_app.name打印當(dāng)前app的名稱,也可以在current_app中存儲(chǔ)一些變量,例如:

應(yīng)用的啟動(dòng)腳本是哪個(gè)文件,啟動(dòng)時(shí)指定了哪些參數(shù)

加載了哪些配置文件,導(dǎo)入了哪些配置

連接了哪個(gè)數(shù)據(jù)庫(kù)

有哪些可以調(diào)用的工具類、常量

當(dāng)前flask應(yīng)用在哪個(gè)機(jī)器上,哪個(gè)IP上運(yùn)行,內(nèi)存多大

current_app.name
current_app.test_value='value'

g變量:g 作為 flask 程序全局的一個(gè)臨時(shí)變量,充當(dāng)者中間媒介的作用,我們可以通過它傳遞一些數(shù)據(jù),g 保存的是當(dāng)前請(qǐng)求的全局變量,不同的請(qǐng)求會(huì)有不同的全局變量,通過不同的thread id區(qū)別

g.name='abc'

注意:不同的請(qǐng)求,會(huì)有不同的全局變量

兩者的區(qū)別:

請(qǐng)求上下文:保存了客戶端和服務(wù)器交互的數(shù)據(jù)

應(yīng)用上下文:flask 應(yīng)用程序運(yùn)行過程中,保存的一些配置信息,比如程序名、數(shù)據(jù)庫(kù)連接、應(yīng)用信息等

11 部署

gunicorn作為服務(wù)器,安裝gunicorn

pip3 install gunicorn

啟動(dòng)

gunicorn -w 3 -b 127.0.0.1:8000 app:app

-w 處理進(jìn)程數(shù)

-b 運(yùn)?主機(jī)ip端?

dpj.wsgi 項(xiàng)?的wsgi

gunicorn常?配置

-c CONFIG : CONFIG,配置?件的路徑,通過配置?件啟動(dòng);?產(chǎn)環(huán)境使?; 
?
-b ADDRESS : ADDRESS,ip加端?,綁定運(yùn)?的主機(jī); 
?
-w INT, --workers INT:?于處理?作進(jìn)程的數(shù)量,為正整數(shù),默認(rèn)為1; 
?
-k STRTING, --worker-class STRTING:要使?的?作模式,默認(rèn)為sync異步,可以下載 
?
eventlet和gevent并指定 
?
--threads INT:處理請(qǐng)求的?作線程數(shù),使?指定數(shù)量的線程運(yùn)?每個(gè)worker。為正整數(shù),默認(rèn)為1。 
?
--worker-connections INT:最?客戶端并發(fā)數(shù)量,默認(rèn)情況下這個(gè)值為1000。 
?
--backlog int:未決連接的最?數(shù)量,即等待服務(wù)的客戶的數(shù)量。默認(rèn)2048個(gè),?般不修改; 
?
-p FILE, --pid FILE:設(shè)置pid?件的?件名,如果不設(shè)置將不會(huì)創(chuàng)建pid?件 
?
--access-logfile FILE : 要寫?的訪問?志?錄--access-logformat STRING:要寫?的訪問?志格式 
?
--error-logfile FILE, --log-file FILE : 要寫?錯(cuò)誤?志的?件?錄。 
?
--log-level LEVEL : 錯(cuò)誤?志輸出等級(jí)。 
?
--limit-request-line INT : HTTP請(qǐng)求頭的?數(shù)的最???,此參數(shù)?于限制HTTP請(qǐng)求?的允 
?
許??,默認(rèn)情況下,這個(gè)值為4094。值是0~8190的數(shù)字。 
?
--limit-request-fields INT : 限制HTTP請(qǐng)求中請(qǐng)求頭字段的數(shù)量。此字段?于限制請(qǐng)求頭字 
?
段的數(shù)量以防?DDOS攻擊,默認(rèn)情況下,這個(gè)值為100,這個(gè)值不能超過32768 
?
--limit-request-field-size INT : 限制HTTP請(qǐng)求中請(qǐng)求頭的??,默認(rèn)情況下這個(gè)值為8190 
?
字節(jié)。值是?個(gè)整數(shù)或者0,當(dāng)該值為0時(shí),表示將對(duì)請(qǐng)求頭??不做限制 
?
-t INT, --timeout INT:超過這么多秒后?作將被殺掉,并重新啟動(dòng)。?般設(shè)定為30秒; 
?
--daemon: 是否以守護(hù)進(jìn)程啟動(dòng),默認(rèn)false; 
?
--chdir: 在加載應(yīng)?程序之前切換?錄; 
?
--graceful-timeout INT:默認(rèn)情況下,這個(gè)值為30,在超時(shí)(從接收到重啟信號(hào)開始)之后仍然活著 
?
的?作將被強(qiáng)?殺死;?般使?默認(rèn); 
?
--keep-alive INT:在keep-alive連接上等待請(qǐng)求的秒數(shù),默認(rèn)情況下值為2。?般設(shè)定在1~5秒之 
?
間。 
?
--reload:默認(rèn)為False。此設(shè)置?于開發(fā),每當(dāng)應(yīng)?程序發(fā)?更改時(shí),都會(huì)導(dǎo)致?作重新啟動(dòng)。 
?
--spew:打印服務(wù)器執(zhí)?過的每?條語(yǔ)句,默認(rèn)False。此選擇為原?性的,即要么全部打印,要么全部 
?
不打?。?
?
--check-config :顯示現(xiàn)在的配置,默認(rèn)值為False,即顯示。 
?
-e ENV, --env ENV: 設(shè)置環(huán)境變量;

到此這篇關(guān)于Flask項(xiàng)目搭建及部署(最全教程)的文章就介紹到這了,更多相關(guān)Flask項(xiàng)目搭建部署內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python多線程和多進(jìn)程關(guān)系詳解

    python多線程和多進(jìn)程關(guān)系詳解

    在本篇文章里小編給大家整理的是一篇關(guān)于python多線程和多進(jìn)程之間的聯(lián)系的基礎(chǔ)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2020-12-12
  • Python繪圖系統(tǒng)之繪制散點(diǎn)圖,極坐標(biāo)和子圖

    Python繪圖系統(tǒng)之繪制散點(diǎn)圖,極坐標(biāo)和子圖

    這篇文章主要為大家詳細(xì)介紹了如何基于Python實(shí)現(xiàn)一個(gè)繪圖系統(tǒng),可以支持繪制散點(diǎn)圖,極坐標(biāo)和子圖,文中的示例代碼講解詳細(xì),感興趣的可以了解下
    2023-09-09
  • Python實(shí)現(xiàn)順序查找的示例代碼

    Python實(shí)現(xiàn)順序查找的示例代碼

    順序查找(Sequential?Search)是一種簡(jiǎn)單直觀的搜索算法,用于在無(wú)序數(shù)組中查找特定元素,本文將介紹順序查找的基本原理,并通過Python代碼進(jìn)行詳細(xì)講解,需要的可以參考一下
    2023-08-08
  • python之如何將標(biāo)簽轉(zhuǎn)化為one-hot(獨(dú)熱編碼)

    python之如何將標(biāo)簽轉(zhuǎn)化為one-hot(獨(dú)熱編碼)

    這篇文章主要介紹了python之如何將標(biāo)簽轉(zhuǎn)化為one-hot(獨(dú)熱編碼)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Python中IPYTHON入門實(shí)例

    Python中IPYTHON入門實(shí)例

    這篇文章主要介紹了Python中IPYTHON的用法入門,較為詳細(xì)的分析了IPYTHON的配置及使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-05-05
  • Python簡(jiǎn)單計(jì)算數(shù)組元素平均值的方法示例

    Python簡(jiǎn)單計(jì)算數(shù)組元素平均值的方法示例

    這篇文章主要介紹了Python簡(jiǎn)單計(jì)算數(shù)組元素平均值的方法,涉及Python簡(jiǎn)單數(shù)組遍歷與數(shù)學(xué)運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下
    2017-12-12
  • Python中的異常處理學(xué)習(xí)筆記

    Python中的異常處理學(xué)習(xí)筆記

    這篇文章主要介紹了Python中的異常處理學(xué)習(xí)筆記,本文講解了常見的異常類、自定義異常類、捕獲異常、拋出異常、上下文管理器等內(nèi)容,需要的朋友可以參考下
    2015-01-01
  • python numpy中對(duì)ndarry按照index增刪改查

    python numpy中對(duì)ndarry按照index增刪改查

    這篇文章主要介紹了python numpy中對(duì)ndarry按照index增刪改查,在numpy中的ndarry是一個(gè)數(shù)組,因此index就是位置下標(biāo),注意下標(biāo)是從0開始,接下來一起進(jìn)入下面文章了解詳細(xì)內(nèi)容吧
    2022-02-02
  • Python中函數(shù)的用法實(shí)例教程

    Python中函數(shù)的用法實(shí)例教程

    這篇文章主要介紹了Python中函數(shù)的用法,以數(shù)值計(jì)算的實(shí)例方式講述了Python程序設(shè)計(jì)中函數(shù)的功能機(jī)抽象化特點(diǎn),需要的朋友可以參考下
    2014-09-09
  • Mac下Supervisor進(jìn)程監(jiān)控管理工具的安裝與配置

    Mac下Supervisor進(jìn)程監(jiān)控管理工具的安裝與配置

    這篇文章主要介紹了Mac下Supervisor進(jìn)程監(jiān)控管理工具的安裝與配置,Supervisor 是由 Python 寫成,是一個(gè)類 unix 操作系統(tǒng)下的進(jìn)程監(jiān)控管理工具,本文講解MAC系統(tǒng)下的配置與安裝,需要的朋友可以參考下
    2014-12-12

最新評(píng)論