Flask项目搭建及部署(完整版!全网最全)

一文掌握Python Flask:HTTP微服务开发从入门到部署 Flask是一个轻量级的Python Web框架,以其"微内核"设计哲学闻名于世。所谓"微"并非指功能简单,而是指核心简洁、高度可扩展——Flask只提供最基础的Web服务能力,其他所有功能都可通过丰富的扩展生态系统按需添加。这种设计让开发者能够从几行代码的简单应用开始,逐步构建出复杂的企业级系统。 阅读详情
AI摘要

本文详细介绍使用Flask框架搭建Web应用的过程,包括环境配置、数据库集成、路由管理、异常处理及部署策略。涵盖Flask-SQLAlchemy、Redis、RabbitMQ等组件的配置与使用。

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、创建flask项目:

创建完成后整个项目结构树:

app.py: 项⽬管理⽂件,通过它管理项⽬。

static: 存放静态文件

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

由于flask属于轻量级web框架, 更加自由、灵活,可扩展性强,第三方库的选择面广,开发时可以结合自己最喜欢用的轮子,也能结合最流行最强大的Python库 。所以这个框架的代码架构需要自己设计。

2、创建项目主要逻辑代码保存目录

手动创建application目录、filter目录及其子目录

application : 项目主要逻辑代码保存目录

_init_.py : 创建flask应用并加载配置,如mysql,redis,rabbitmq,

apps : 专门用于保存每一个项目的蓝图

app1 : app1蓝图目录,在app1下的init_.py中文件中创建蓝图对象,view.py中新增对应的视图文件,在 model.py中写模型代码

settings : 项目配置存储目录

dev.py : 项目开发阶段配置文件

prop.py : 项目生成阶段配置文件

static : 项目静态文件夹(用于存放css一类的文件)

templates : 用于放置html模板文件

filter : 整个项目拦截器目录

requestFilter.py: 针对整个app项目全局路由拦截规则定义

app.py : 项⽬管理⽂件,通过它启动整个项目

2.1 配置mysql数据库,加载配置文件并针对整个app项目定义全局db

2.1.1 settings.py
#全局通用配置类
class Config(object):
    """项目配置核心类"""
    #调试模式
    DEBUG=False
​
    # 配置日志
    # LOG_LEVEL = "DEBUG"
    LOG_LEVEL = "INFO"
​
​
    # 配置redis
    # 项目上线以后,这个地址就会被替换成真实IP地址,mysql也是
    REDIS_HOST = 'your host'
    REDIS_PORT = your port
    REDIS_PASSWORD = 'your password'
    REDIS_POLL = 10
​
    #数据库连接格式
    SQLALCHEMY_DATABASE_URI = "mysql+pymysql://user:password@localhost:3306/test?charset=utf8"
    # 动态追踪修改设置,如未设置只会提示警告
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    # 查询时会显示原始SQL语句
    SQLALCHEMY_ECHO = False
    # 数据库连接池的大小
    SQLALCHEMY_POOL_SIZE=10
    #指定数据库连接池的超时时间
    SQLALCHEMY_POOL_TIMEOUT=10
    # 控制在连接池达到最大值后可以创建的连接数。当这些额外的 连接回收到连接池后将会被断开和抛弃。
    SQLALCHEMY_MAX_OVERFLOW=2
​
​
    #rabbitmq参数配置
    RABBITUSER="user"
    RABBITPASSWORD="password"
    RABBITHOST="your ip"
    RABBITPORT=your port

2.1.2 dev.py
from . import Config
​
class DevelopmentConfig(Config):
    '开发模式下的配置'
    # 查询时会显示原始SQL语句
    SQLALCHEMY_ECHO = True
2.1.3 prop.py
from . import Config
​
class ProductionConfig(Config):
    """生产模式下的配置"""
    DEBUG = False
2.1.4 加载配置文件,定义全局的db( SQLALchemy类的实例 )供项目使用
# 主应用的根目录
app = Flask(__name__)
​
config = {
    'dev': DevelopmentConfig,
    'prop': ProductionConfig,
}
​
# 设置配置类
Config = config['dev']
​
# 加载配置
app.config.from_object(Config)
​
# 创建数据库连接对象
db = SQLAlchemy(app)

dev : 测试环境配置

prop: 生产环境配置

Flask应用app配置加载

通常三种方式

  • 从配置对象中加载:app.config.from_object()

  • 从配置文件中加载:app.config.from_pyfile()-ini文件

  • 从环境变量中加载:app.config.from_envvar()

配置对象

  • 从配置对象中加载,创建配置的类:

# 配置对象,里面定义需要给 APP 添加的一系列配置
class Config(object):
    DEBUG = True
​
​
app = Flask(__name__)
​
# 从配置对象中加载配置
app.config.from_object(Config)
app.run()

配置文件

  • 从配置文件中加载,在目录中定义一个配置文件config.ini

app = Flask(__name__)
​
# 从配置对象中加载配置
app.config.from_pyfile("config.ini")
app.run()

环境变量

app = Flask(__name__)
# 从环境变量中加载
app.config.from_envvar("FLASKCONFIG")
app.run()

2.2 定义model模型,负责和数据库交互

app1.model

from application import db
​
class Wdtest(db.Model):
    __tablename__ = "wdtest" #设置表名
    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="年龄")

模型 表示程序使用的持久化实体. 在Flask-SQLALchemy 中, 模型一般是一个 Python 类, 类中的属性对应数据库中的表.

db.Model :创建模型,

db.Column : 创建模型属性.

tablename :指定表名

模型属性类型 :

类型名Python类型说明
Integerint普通整数,一般是 32 位
SmallIntegerint取值范围小的整数,一般是 16 位
Big Integerint 或 long不限制精度的整数
Floatfloat浮点数
Numericdecimal.Decimal定点数
Stringstr变长字符串
Textstr变长字符串,对较长或不限长度的字符串做了优化
Unicodeunicode变长 Unicode 字符串
Unicode Textunicode变长 Unicode 字符串,对较长或不限长度的字符串做了优化
Booleanbool布尔值
Datedatetime.date日期
Timedatetime.time时间
DateTimedatetime.datetime日期和时间
Intervaldatetime.timedelta时间间隔
Enumstr一组字符串
PickleType任何 Python 对象自动使用 Pickle 序列化
LargeBinarystr二进制文件

常用 SQLAlchemy 列选项

选项名说明
primary_key如果设为 True,这列就是表的主键
unique如果设为 True,这列不允许出现重复的值
index如果设为 True,为这列创建索引,提升查询效率
nullable如果设为 True,这列允许使用空值;如果设为 False,这列不允许使用空值
default为这列定义默认值

2.3 声明蓝图

app1._init.py

#给app取别名为 'index'
index_blu=Blueprint('index',__name__,template_folder='templates',static_folder='static')
​
from .views import *

template_folder:指定模板文件路径,查找顺序,先全局templates里面找,没找到,再往子蓝图里面找.

这里是把view中所有的视图都声明在index这个蓝图里面,接下来我们需要做的是将这个声明好的蓝图,注册进我们的项目中。

2.4 将声明好的蓝图注册进app中

application.init_:

from application.settings.dev import DevelopmentConfig
from application.settings.prop import ProductionConfig
​
# 主应用的根目录
app = Flask(__name__)
​
config = {
    'dev': DevelopmentConfig,
    'prop': ProductionConfig,
}
​
# 设置配置类
Config = config['dev']
​
# 加载配置
app.config.from_object(Config)
​
# 创建数据库连接对象
db = SQLAlchemy(app)
​
# todo 注册蓝图
from .apps.app1 import index_blu
app.register_blueprint(index_blu, url_prefix='/index')

针对:app = Flask(name)解释

Flask类初始化参数

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:静态文件访问路径,可以不传,默认为:/ + static_folder

  • static_folder:静态文件存储的文件夹,可以不传,默认为 static

  • template_folder:模板文件存储的文件夹,可以不传,默认为 templates

3 通过以上的步骤后,我们可以基本操作数据库了:

以下所有示例代码,皆在view.py中去实现

3.1 增:

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

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

3.2 删:

先获取数据库中的这个数据,再删除它

    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:
    # 事務回滾
    application.db.session.rollback()

3.4 查:

# 查询所有⽤户数据
user_list=Wdtest.query.all()
​
# 查询有多少个⽤户
user_list_num=Wdtest.query.count()
# 查询第1个⽤户
user=Wdtest.query.first()
# 查询id为3的⽤户[3种⽅式]
user=Wdtest.query.get(3)  # 根据主键查询
user_list=Wdtest.query.filter_by(id=3).all()  # 以关键字实参形式进行匹配字段
user_list=Wdtest.query.filter(Wdtest.id == 3).all()  # 以恒等式形式匹配字段
​
# 查询名字结尾字符为g的所有⽤户
Wdtest.query.filter(Wdtest.name.endswith('g')).all()
​
# 查询名字包含‘wa'的所有项目
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个
user_list=Wdtest.query.order_by(Wdtest.age,Wdtest.id.desc()).limit(5).all()
​
# 分⻚查询, 每⻚3个, 查询第2⻚的数据
pn = Wdtest.query.paginate(2,3)
print(pn.pages)
print(pn.page)
print(pn.items)

4 路由传参

有时我们需要将同一类 URL 映射到同一个视图函数处理,比如:使用同一个视图函数来显示不同用户的个人信息。

# 路由传递参数
@app.route('/user/<id>')
def user_info(id):
    return '%s' % id

路由传递的参数默认当做 string 处理

####指定请求方式

在 Flask 中,定义一个路由,默认的请求方式为:

  • GET

  • OPTIONS

  • HEAD

在装饰器添加请求指定方式:

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

5 动态正则匹配路由

flask实现正则匹配步骤:

  • 导入转换器基类:在 Flask 中,所有的路由的匹配规则都是使用转换器对象进行记录

  • 自定义转换器:自定义类继承于转换器基类

  • 添加转换器到默认的转换器字典中

  • 使用自定义转换器实现自定义匹配规则

###实现:

  • 导入转换器基类

from werkzeug.routing import BaseConverter
  • 自定义转换器

# 自定义正则转换器
class RegexConverter(BaseConverter):
    def __init__(self, url_map, *args):
        super(RegexConverter, self).__init__(url_map)
        # 将接受的第1个参数当作匹配规则进行保存
        self.regex = args[0]
  • 添加转换器到默认的转换器字典中,并指定转换器使用时名字为: re

app = Flask(__name__)
​
# 将自定义转换器添加到转换器字典中,并指定转换器使用时名字为: regex
app.url_map.converters['regex'] = RegexConverter
  • 使用转换器去实现自定义匹配规则

    • 当前此处定义的规则是:3位数字

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

自定义转换器其他函数实现

继承于自定义转换器之后,还可以实现 to_python 和 to_url 这两个函数去对匹配参数做进一步处理:

  • to_python:

    • 该函数参数中的 value 值代表匹配到的值,可输出进行查看

    • 匹配完成之后,对匹配到的参数作最后一步处理再返回,比如:转成 int 类型的值再返回:

class RegexConverter(BaseConverter):
    def __init__(self, url_map, *args):
        super(RegexConverter, self).__init__(url_map)
        # 将接受的第1个参数当作匹配规则进行保存
        self.regex = args[0]
​
    def to_python(self, value):
        return int(value)

系统自带转换器

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"

日志记录级别

FATAL/CRITICAL = 致命的,危险的
ERROR = 错误
WARNING = 警告
INFO = 信息
DEBUG = 调试
NOTSET = 没有设置

application._init:

1、日志模块基础配置,如:日志存放地址、日志记录格式、日志等级

#增加日志模块
def setup_log(Config):
    #设置日志等级
    logging.basicConfig(level=Config.LOG_LEVEL)
    # 创建日志记录器,指明日志保存的路径、每个日志文件的最大大小、保存的日志文件个数上限
    file_log_handler=RotatingFileHandler('log/log',maxBytes=1024 * 1024 * 300, backupCount=10)
    # 创建日志记录的格式 日志等级 输入日志信息的文件名 行数 日志信息
    formatter = logging.Formatter('%(asctime)s: %(levelname)s %(filename)s:%(lineno)d %(message)s')
    # 为刚创建的日志记录器设置日志记录格式
    file_log_handler.setFormatter(formatter)
    # 为全局的日志工具对象(flaskapp使用的)添加日志记录器
    logging.getLogger().addHandler(file_log_handler)

2、日志启动

#日志启动
setup_log(Config)

6.2 redis配置及加载

之前我们在config中已经把redis的配置已经写进去了,所以这里可以直接创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基础配置及加载

# rabbitmq配置访问
# 添加用户名和密码
credentials = pika.PlainCredentials(Config.RABBITUSER, Config.RABBITPASSWORD)
# 配置连接参数
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 全局拦截器配置

filerter.requestFilter

这里只是简单针对请求路径非index的进行拦截,如果还有其他拦截条件或者机制,可以继续在filter这个包下添加

from flask import request
import application
​
# 拦截器,每次的请求进来都会做的操作
@application.app.before_request
def before_action():
    # 获取当前请求的路由(路径)
    a = request.path
    print(a)
    u = a.split('/')
    if len(a)>2:
        if u[1] == 'index':
            print('success')
    else:
        return "无权限请求"

拦截器加载进app:

#拦截器加载
requestFilter.before_action

8 请求对象request和返回对象Response

请求对象request,使用前先导入request模块

from flask import request
  • 获取url请求参数:request.args

  • 获取form表单中的数据:request.form

  • 获取请求体原始数据:request.data

  • 获取文件数据:request.files

  • 获取cookie:request.cookies

  • 获取header信息:request.headers

  • 获取请求方法:request.method

  • 获取请求路径:request.path

Response

  • 视图函数中可以返回的值

    • 可以直接返回字符串,底层将这个字符串封装成了Response对象

    • 元组,响应格式(响应体,状态码,头信息),不一定都要写,底层也是封装了一个Response对象

    • 返回Response或其子类(jsonify子类返回标准json)

  • 实现一个自定义Response对象步骤

    • 继承Response对象

    • 实现方法 force_typeforce_type(cls,rv,environ=None)

    • 指定app.response为你定义的类

    • 如果返回的值不是可以返回的对象,就会调用force_type方法

实现

class JSONResponse(Response):
​
    @classmethod
    def force_type(cls, response, environ=None):
        '''
        这个方法只有视图函数返回非字符、非元祖、非Response对象才会调用
        :param response:是视图函数的返回值
        :param environ:
        :return:
        '''
        print(response)
        print(type(response))
        if isinstance(response,(list,dict)):
​
            #jsonify除了将字典转换成json对象,还将对象包装成了一个Response对象
            response = jsonify(response)
​
        return super(JSONResponse,cls).force_type(response,environ) 
        
app.response_class = JSONResponse

9 异常捕获及自定义异常

捕获错误

  • errorhandler 装饰器

    • 注册一个错误处理程序,当程序抛出指定错误状态码的时候,就会调用该装饰器所装饰的方法

  • 参数:

    • code_or_exception – HTTP的错误状态码或指定异常

  • 例如统一处理状态码为500,404的错误给用户友好的提示:

@app.errorhandler(500)
def internal_server_error(e):
    return '服务器搬家了哈哈哈'
​
@app.errorhandler(404)
def internal_server_error(e):
    return '瞎请求什么路径呢'

  • 例如自定义错误413

@app.errorhandler(413)
def zero_division_error(e):
    return '除数不能为0'

异常捕获

  • abort 方法

    • 抛出一个给定状态代码的 HTTPException 或者 指定响应,例如想要用一个页面未找到异常来终止请求,你可以调用 abort(404)。

  • 参数:

    • code – HTTP的错误状态码

@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 上下文

上下文:即语境,语意,在程序中可以理解为在代码执行到某个时刻,根据之前代码锁做的操作以及下文即将要执行的逻辑,可以决定在当前时刻下可以使用到的变量,或者可以做的事情。

Flask中有两种上下文:请求上下文(request context)和应用上下文(application context)。

Flask中上下文对象:相当于一个容器,保存了Flask程序运行过程中的一些信息。

1.application指的是当你调用app = flask(name)创建的这个对象app。 2.request指的是每次http请求发生时,WSGI server(比如gunicorn)调用Flask.call()之后,在Flask对象内部创建的Request对象; 3.application表示用于相应WSGI请求的应用本身,request表示没出http请求; 4.appliacation的生命周期大于request,一个application存活期间,可能发生多次http请求,所以,也就会有多个request;

请求上下文(request context):在Flask中,可以直接在视图函数中使用request这个独享进行获取先关数据,而request就是请求上下文的对象,保存了当前本次请求的相关数据,请求上线文对象有:request、session

request:封装了HTTP请求的内容,针对的是http请求。例如:user = request.args.get('user'),获取的是get请求的参数。

session:用来记录请求会话中的信息,针对的是用户信息。例如:session['name'] = user.id 科可以记录用户信息。还可以通过session.get('name')获取用户信息。

应用上下文(application context):它不是一直存在的,它只是request context中的一个对app的代理,所谓的local proxy。它的作用主要是帮助request获取当前的应用,它是伴request而生,随request而灭的。

应用上下文对象有:current_app,g

current_app:应用程序上下文,用于存储应用程序中的变量,可以通过current_app.name打印当前app的名称,也可以在current_app中存储一些变量,例如:

  • 应用的启动脚本是哪个文件,启动时指定了哪些参数

  • 加载了哪些配置文件,导入了哪些配置

  • 连接了哪个数据库

  • 有哪些可以调用的工具类、常量

  • 当前flask应用在哪个机器上,哪个IP上运行,内存多大

current_app.name
current_app.test_value='value'

g变量:g 作为 flask 程序全局的一个临时变量,充当者中间媒介的作用,我们可以通过它传递一些数据,g 保存的是当前请求的全局变量,不同的请求会有不同的全局变量,通过不同的thread id区别

g.name='abc'

注意:不同的请求,会有不同的全局变量

两者的区别:

  • 请求上下文:保存了客户端和服务器交互的数据

  • 应用上下文:flask 应用程序运行过程中,保存的一些配置信息,比如程序名、数据库连接、应用信息等

11 部署

gunicorn作为服务器,安装gunicorn

pip3 install gunicorn

启动

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

-w 处理进程数

-b 运⾏主机ip端⼝

dpj.wsgi 项⽬的wsgi

gunicorn常⽤配置

-c CONFIG : CONFIG,配置⽂件的路径,通过配置⽂件启动;⽣产环境使⽤; 
​
-b ADDRESS : ADDRESS,ip加端⼝,绑定运⾏的主机; 
​
-w INT, --workers INT:⽤于处理⼯作进程的数量,为正整数,默认为1; 
​
-k STRTING, --worker-class STRTING:要使⽤的⼯作模式,默认为sync异步,可以下载 
​
eventlet和gevent并指定 
​
--threads INT:处理请求的⼯作线程数,使⽤指定数量的线程运⾏每个worker。为正整数,默认为1。 
​
--worker-connections INT:最⼤客户端并发数量,默认情况下这个值为1000。 
​
--backlog int:未决连接的最⼤数量,即等待服务的客户的数量。默认2048个,⼀般不修改; 
​
-p FILE, --pid FILE:设置pid⽂件的⽂件名,如果不设置将不会创建pid⽂件 
​
--access-logfile FILE : 要写⼊的访问⽇志⽬录--access-logformat STRING:要写⼊的访问⽇志格式 
​
--error-logfile FILE, --log-file FILE : 要写⼊错误⽇志的⽂件⽬录。 
​
--log-level LEVEL : 错误⽇志输出等级。 
​
--limit-request-line INT : HTTP请求头的⾏数的最⼤⼤⼩,此参数⽤于限制HTTP请求⾏的允 
​
许⼤⼩,默认情况下,这个值为4094。值是0~8190的数字。 
​
--limit-request-fields INT : 限制HTTP请求中请求头字段的数量。此字段⽤于限制请求头字 
​
段的数量以防⽌DDOS攻击,默认情况下,这个值为100,这个值不能超过32768 
​
--limit-request-field-size INT : 限制HTTP请求中请求头的⼤⼩,默认情况下这个值为8190 
​
字节。值是⼀个整数或者0,当该值为0时,表示将对请求头⼤⼩不做限制 
​
-t INT, --timeout INT:超过这么多秒后⼯作将被杀掉,并重新启动。⼀般设定为30秒; 
​
--daemon: 是否以守护进程启动,默认false; 
​
--chdir: 在加载应⽤程序之前切换⽬录; 
​
--graceful-timeout INT:默认情况下,这个值为30,在超时(从接收到重启信号开始)之后仍然活着 
​
的⼯作将被强⾏杀死;⼀般使⽤默认; 
​
--keep-alive INT:在keep-alive连接上等待请求的秒数,默认情况下值为2。⼀般设定在1~5秒之 
​
间。 
​
--reload:默认为False。此设置⽤于开发,每当应⽤程序发⽣更改时,都会导致⼯作重新启动。 
​
--spew:打印服务器执⾏过的每⼀条语句,默认False。此选择为原⼦性的,即要么全部打印,要么全部 
​
不打印; 
​
--check-config :显示现在的配置,默认值为False,即显示。 
​
-e ENV, --env ENV: 设置环境变量;
Flask教程1:flask框架基础入门,路由、模板、装饰器 Flask是一个非常小的Python Web框架,被称为微型框架;只提供了一个稳健的核心,其他功能全部是通过扩展实现的;意思就是我们可以根据项目的需要量身定制,也意味着我们需要学习各种扩展库的使用。 阅读详情

相关推荐

Flask深度学习模型服务端部署

1、Flask框架简介 Flask是一个使用Python编写的轻量级Web应用框架,可扩展性很强,相较于Django框架,灵活度很高,开发成本底。它仅仅实现了Web应用的核心功能,Flask由两个主要依赖组成,提供路由、调试、Web服务器网关接口的Werkzeug 实现的和模板语言依赖的jinja2,其他的一切都可以由第三方库来完成。 2、Flask框架安装 在使用Flask之前需要安装一下,安装Flask非常简单只需要在在命令行输入 pip install flask即可 3、Flask实现 Hell

KaikebaAI的博客 7412

Flask框架入门教程(非常详细)从零基础入门到精通,看完这一篇就够了

Flask是一个非常小的PythonWeb框架,被称为微型框架;只提供了一个稳健的核心,其他功能全部是通过扩展实现的;意思就是我们可以根据项目的需要量身定制,也意味着我们需要学习各种扩展库的使用。

wly55690的博客 18万+

从0到1,Web框架 Flask 全网最全教学!全文1w字,蓝图、会话、日志、部署等使用 Flask 搭建中小型企业级项目

Flask是一个使用Python编写的轻量级Web应用框架,它简洁而灵活,适用于开发小型至中型的Web应用。本文将介绍Flask框架的基本概念、特点以及如何使用Flask来快速搭建Web应用,争取在两周内,介绍一篇企业级响应速度的轻量级python Web框架sanic和异步数据库SQLAlchemy。2024年6月27日找工作日记,21岁,简历–》https://xiaoyus.cc/index.php/sample-page/Flask。

m0_74825152的博客 1487

Flask框架——(认识Flask框架及项目配置)

Flask框架 1. Flask框架介绍 flask是⼀款⾮常流⾏的Python Web框架,出⽣于2010年,作者是ArminRonacher,本来这个项⽬只是作者在愚⼈节的⼀个玩笑,后来由于⾮常受欢迎,进⽽成为⼀个正式的项⽬。 flask⾃2010年发布第⼀个版本以来,⼤受欢迎,深得开发者的喜爱,并且在多个公司已经得到了应⽤,flask能如此流⾏的原因,可以分为以下⼏点: 微框架、简洁、只做...

weixin_45550881的博客 2万+

阿里云部署Flask项目

阿里云Flask项目部署记录 本文记录了在阿里云虚拟机上首次部署Flask项目的过程。主要解决了Python版本升级(3.6→3.11)、依赖库安装(用flask-sqlalchemy替代flask_mysqldb)、Gunicorn配置等问题。通过阿里云官方文档快速升级了Python版本,并创建了Gunicorn启动脚本。部署过程中还尝试使用MariaDB替代MySQL,但遇到连接问题。整个部署过程参考了相关技术博客和阿里云官方文档,最终成功将服务运行起来。

chuweiyan的博客 217

基于ENVI5.3的Landsat条带去除、辐射定标、大气校正

基于ENVI5.3的Landsat条带去除、辐射定标、大气校正坏带修复辐射定标大气校正 坏带修复 1.下载landsat_gapfill插件,放入“安装目录\Exelis\ENVI53\extensions”,重启ENVI 2. 加载拟处理文件(MTL.txt格式) 3.打开landsat_gapfill 4.选择存放位置并命名文件 5.选择处理文件 辐射定标 1.选择工具Radiometric Calibration 2.选择已修复坏带文件 3.修改参数,选择输出位置及命名文件 大气校正 1

u010198950的博客 1万+

全网最菜鸟Linux宝塔面板部署Flask项目(Flask+MySQL)

本文是笔者成功用宝塔面板部署Flask+MySQL项目之后写的经验小结,如有不对的地方请多指正,因为在碰到这些问题时少有过往经验,没有相关帖子,故总结此篇教程用作分享,希望可以给您带来一些帮助或者遇上bug的启发!!

2301_81772741的博客 3790

RouterOS网桥VLAN实战:从零构建安全隔离的二层虚拟网络

本文详细讲解了如何在RouterOS上利用网桥和VLAN功能,从零开始构建安全隔离的二层虚拟网络。通过分步实战演示,涵盖核心概念、网桥创建、PVID设置、VLAN规则配置及安全过滤,帮助网络管理员实现办公、访客与服务器网络的逻辑隔离与灵活管理,提升网络安全性。

u9v0w的博客 504

全网最全的使用Docker部署Flask教程

文章目录1 创建一个最小的Flask应用1.1 app.py文件1.2 requirements.txt 文件1.3 Dockerfile文件1.4 本地文件的目录结构(重点)2 使用Dockerfile打包镜像3 进入运行的镜像内部 1 创建一个最小的Flask应用 1.1 app.py文件 from flask import Flask app = Flask(__name__) @app.route('/') def index(): return "Hello dokcer flask"

kobe_okok的博客 7828

Debian下Rust环境极速安装指南:国内镜像+避坑配置(附清华/中科大源对比)

本文详细介绍了在Debian系统上快速安装和配置Rust开发环境的完整指南。针对国内网络环境,重点对比评测了清华大学、中国科学技术大学等主流镜像源,提供了详细的安装配置步骤、Cargo优化技巧以及常见问题排查方案,帮助开发者显著提升依赖下载和编译效率。

s8t9u0v1w的博客 1161

DexProtector内存态匿名段检测绕过与dex重组技术

Dex文件是Android应用的核心执行单元,其结构规范(如header_item、class_def_item、code_item)决定了运行时加载与解析的底层逻辑。DexProtector通过将dex数据拆解为多个无文件名、受保护的内存匿名段(如[anon:dp_header]、[anon:dp_code]),规避传统基于文件特征或标准加载路径的检测机制。该策略依赖Android mmap内存管理与ART虚拟机对dex结构的刚性要求,形成可被观测的布局规律。理解其内存态组织原理,结合权限/大小/命名/内

weixin_30855761的博客 689

Flask+Vue3+宝塔面板部署前后端【全网独家!!!】

最近博主刚学完,迫不及待的需要敲一个项目,前端使用开发,后端由于博主没有学过,于是想到使用“”作为后端,关于搭建在全网搜索也没有见一个讲明白的,为此博主再成功搭建完成后,特地记录此博客,方便大家学习在这里我们分两块讲解:“”与“”,道理基本一致,但些许细节不同。

zheshiyangyang的博客 2626

《MATLAB项目实战》,专栏目录和介绍

MATLAB 是一款强大且广泛应用的数值计算和数据可视化软件工具,它提供了一个高效、简洁的编程环境,使用户能够进行从简单的矩阵运算到复杂的多维数据分析的各种计算任务。无论是在人工智能、计算机视觉、图像处理还是其他领域,MATLAB 都能够提供精准、快速的解决方案,因此成为了全球科研人员、工程师以及数据分析师的得力工具。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 6478

Flask 项目部署

安装gunicorn服务器 pip3 install gunicorn 移动到flask项目app.py所在目录 cd flask-project-master/ 3.启动 gunicorn -preload -w 3 -b 0.0.0.0:8000 app:app & 参考:1.Flask项目搭建及部署(完整版!全网最全)

时越的博客 439

关节电机技术全解析:原理、双编码器、控制方法与硬件选型

关于关机电机的组成,技术原理,特点以及选型等方面的详细介绍,可以帮助快速学习关节电机相关内容!

start_up_go的博客 692

Unity3D实现自定义河流路径或泥石流路径

此工具是一个插件,插件很好用,可以根据地形编辑河流的走向以及宽度,也可以发挥想象编辑成其他的效果,比如泥石流效果,岩浆效果,小溪,或者大江或者大河等等博客将会介绍可以编辑河流的工具的使用。希望这篇博客对Unity的开发者有所帮助。大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。提示:以下是本篇文章正文内容,下面案例可供参考本次总结的就是工具的使用, 有需要会继续增加功能不定时更新Unity开发技巧,觉得有用记得一键三连哦。么么哒!

心疼你的一切博客 5266

Linux环境使用Docker手工部署Flask项目

Linux环境使用Docker手工部署Flask项目步骤详解,附报错解决方案

林家小猪 1614

Taro React组件使用(5) —— RuiPasswordInput 密码输入框显示隐藏和清空

初始化时,需要将传入的 value 赋值给当前组件的 value, 不能直接修改 props 的 value;在组件内输出组件内的变量时,最好先判断输出函数是否定义,再输出,否则很容易引起报错。

止于至善 891

Flask项目部署到阿里云服务器(全网最清晰简单完整部署),linux命令和脚本文件 nginx安装到服务器等每一步清晰记录

激活后,命令行提示符前会显示虚拟环境的名字(my_venv),这表明当前正处于此虚拟环境中运行命令,此时安装的Python包将只在这个环境中生效,不会影响全局Python环境。在部署flask项目时候,因为flask是一个轻量级的Python Web框架,其本身并不包含一个成熟的Web服务器组件,而是依赖于内置的简易服务器(werkzeug)这段配置是告诉Nginx监听公网端口80,并将所有到此服务器的请求转发到本地端口8080(是你的python项目本地运行的端口)。优先级默认:默认(1);

m0_66111719的博客 1万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

上一篇: 第13章 继续进阶——你还应该掌握的高级技巧
下一篇: 移动端编程技术期末课程设计---基于Android 的宿舍选择系统的设计与实现
Roderick888888
博客等级 码龄6年 295粉丝 23原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值