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

【阿里云大模型高级工程师ACP习题集】2.3 优化提示词改善答疑机器人回答质量

【摘要】这是我精心整理出对应的习题集,里面足足有 30 道题目,从基础概念到深度拓展,全方位覆盖章节重点、难点。不管你是想检验自己的学习成果,还是想针对薄弱环节进行强化训练,它都能完美适配!

davidkorhenn的博客 1630

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

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

2301_81772741的博客 3791

通达信+大智慧数据同步存调DLL

数据同步存调DLL(通达信版+大智慧版)

guleba的博客 2053

全网最全的使用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

C语言 函数

一、什么是函数 二、函数的相关语法 三、函数编码规范

m0_57105760的博客 1890

Hand-Eye 标定误差分析:从理论到 C++ 实现

本文深入探讨了机器人手眼标定中的核心环节——误差分析。文章从AX=XB方程的理论残差出发,详细解析了旋转与平移误差的数学定义与物理意义,并提供了一个工业级的C++实现代码,用于计算重投影误差。通过误差分析,工程师可以量化标定精度,诊断问题根源,从而确保视觉引导机器人系统在实际应用中的可靠性与精确性。

c7d8e的博客 695

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

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

zheshiyangyang的博客 2626

那些年对支付宝的研究[整理]

支付宝功能强大.他内部各个功能间的跳转是通过Uri 实现的.而使用window.location.href 即可.跟浏览器一样的协议.很方便 H5启动支付宝: alipays://platformapi/startapp?appId=20000067&url=网址 alipays://platformapi/startapp?appId=20000691&url=网址 ali...

技术专研 8915

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

华为OD新系统机试真题-文章特征提取

华为OD机试新系统真题 【文章特征提取】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD新系统机试真题【文章特征提取】

qq_45776114的博客 729

软件集成:Simulink与STM32联合开发

本文首先通过一个简单的Simulink模型生成代码,然后将代码copy到一个STM32工程中去编译软件。最后将软件下载到STM32F407中,通过串口输出Simulink计算的结果。 阅读本文需要有一定的STM32开发调试经验和Simulink代码生成经验。关于Simulink代码生成可以参考博主的专栏《Simulink代码生成》。 文章目录1 问题引入2 集成方案3 建模与编程过程3.1 Simulink模型搭建3.2 代码生成配置3.3 STM32工程搭建3.4 STM32的main.c文件修改3.4.

u013288925的博客 2万+

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

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

林家小猪 1614

验证方法、符合性方法与设计保证的关系

未来,随着适航标准和工程实践的不断演进,验证与符合性方法将持续优化,以应对日益复杂的系统设计需求。设计保证过程中的验证活动具有双重作用,既用于设计过程的质量控制和风险管理,又作为适航符合性方法的重要支持材料。在未来的航空电子系统开发中,进一步优化设计保证与验证活动的协同作用,将有助于应对日益复杂的工程挑战,推动航空安全技术的发展。为了全面理解这二者之间的关系,本章将系统说明设计保证过程中的验证活动如何既服务于设计保证,又作为符合性方法中的核心证明材料。最终,通过功能测试和环境测试验证硬件的实际性能。

qq_41854911的博客 554

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

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

m0_66111719的博客 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值