目录


  • Flask四剑客
  • 配置文件的方式
  • 第一种方式
  • 第二种方式
  • 第三种方式
  • 第四种方式
  • 其他方式

Flask四剑客

在Django中后端返回响应有几种形式:render(前端渲染页面)、redirect(重定向跳转)、HttpResponse(直接返回)、JsonResponse(实际内部继承了HttpResponse,返回json字符串)。

在Flask中也有相对的返回机制:

  • render:前端渲染页面
  • redirect_:重定向跳转
  • jsonify:返回json字符串
  • return 'xx':相当于HttpResponse
from flask import Flask, render_template, redirect, jsonify
app = Flask(__name__)

@app.route('/login')
def login():
    return render_template('login.html')  # 渲染login.html页面

@app.route('/index')
def index():
    return redirect('/login')  # 重定向跳转至'/login',显示login.html页面

@app.route('/test')
def test():
    data = {'name': 'Bob', 'age': 18}
    return jsonify(data)  # 页面响应结果:{"age":18,"name":"Bob"}

@app.route('/test1')
def test1():
    return 'ok'  # 页面响应结果:ok。需要注意的是:return返回时不能返回数字类型,The return type must be a string, dict, tuple, Response instance, or WSGI callable

if __name__ == '__main__':
    app.run()
from flask import Flask, render_template, redirect, jsonify
app = Flask(__name__)

@app.route('/login')
def login():
    return render_template('login.html')  # 渲染login.html页面

@app.route('/index')
def index():
    return redirect('/login')  # 重定向跳转至'/login',显示login.html页面

@app.route('/test')
def test():
    data = {'name': 'Bob', 'age': 18}
    return jsonify(data)  # 页面响应结果:{"age":18,"name":"Bob"}

@app.route('/test1')
def test1():
    return 'ok'  # 页面响应结果:ok。需要注意的是:return返回时不能返回数字类型,The return type must be a string, dict, tuple, Response instance, or WSGI callable

if __name__ == '__main__':
    app.run()
login.html 页面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>用户登录</h1>
    <form method="post">
        <input type="text" name="user">
        <input type="text" name="pwd">
        <input type="submit" value="登录">{{error}}
    </form>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>用户登录</h1>
    <form method="post">
        <input type="text" name="user">
        <input type="text" name="pwd">
        <input type="submit" value="登录">{{error}}
    </form>
</body>
</html>
注意:在django中html模板页面都是放在templates文件夹下,在flask中也需要新建一个templates文件夹,统一将html页面放在templates文件夹下
# 在Flask源码中,实例化__init__()方法中就已经定义了参数
def __init__(
        self,
        import_name,
        static_url_path=None,
        static_folder="static",  # 放置静态文件的文件夹名,同django中的static
        static_host=None,
        host_matching=False,
        subdomain_matching=False,
        template_folder="templates",   # 放置html页面的文件夹名,同django中的templates
        instance_path=None,
        instance_relative_config=False,
        root_path=None,
    ):
'''
:param template_folder: the folder that contains the templates that should be used by the application.  Defaults to ``'templates'`` folder in the root path of the application.
'''
# 在Flask源码中,实例化__init__()方法中就已经定义了参数
def __init__(
        self,
        import_name,
        static_url_path=None,
        static_folder="static",  # 放置静态文件的文件夹名,同django中的static
        static_host=None,
        host_matching=False,
        subdomain_matching=False,
        template_folder="templates",   # 放置html页面的文件夹名,同django中的templates
        instance_path=None,
        instance_relative_config=False,
        root_path=None,
    ):
'''
:param template_folder: the folder that contains the templates that should be used by the application.  Defaults to ``'templates'`` folder in the root path of the application.
'''

配置文件的方式

flask中的配置文件是一个flask.config.Config对象(继承字典),默认配置为:

{
        'DEBUG':                                get_debug_flag(default=False),  是否开启Debug模式
        'TESTING':                              False,                          是否开启测试模式
        'PROPAGATE_EXCEPTIONS':                 None,                          
        'PRESERVE_CONTEXT_ON_EXCEPTION':        None,
        'SECRET_KEY':                           None,
        'PERMANENT_SESSION_LIFETIME':           timedelta(days=31),
        'USE_X_SENDFILE':                       False,
        'LOGGER_NAME':                          None,
        'LOGGER_HANDLER_POLICY':               'always',
        'SERVER_NAME':                          None,
        'APPLICATION_ROOT':                     None,
        '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,
        'MAX_CONTENT_LENGTH':                   None,
        'SEND_FILE_MAX_AGE_DEFAULT':            timedelta(hours=12),
        'TRAP_BAD_REQUEST_ERRORS':              False,
        'TRAP_HTTP_EXCEPTIONS':                 False,
        'EXPLAIN_TEMPLATE_LOADING':             False,
        'PREFERRED_URL_SCHEME':                 'http',
        'JSON_AS_ASCII':                        True,
        'JSON_SORT_KEYS':                       True,
        'JSONIFY_PRETTYPRINT_REGULAR':          True,
        'JSONIFY_MIMETYPE':                     'application/json',
        'TEMPLATES_AUTO_RELOAD':                None,
    }
 {
        'DEBUG':                                get_debug_flag(default=False),  是否开启Debug模式
        'TESTING':                              False,                          是否开启测试模式
        'PROPAGATE_EXCEPTIONS':                 None,                          
        'PRESERVE_CONTEXT_ON_EXCEPTION':        None,
        'SECRET_KEY':                           None,
        'PERMANENT_SESSION_LIFETIME':           timedelta(days=31),
        'USE_X_SENDFILE':                       False,
        'LOGGER_NAME':                          None,
        'LOGGER_HANDLER_POLICY':               'always',
        'SERVER_NAME':                          None,
        'APPLICATION_ROOT':                     None,
        '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,
        'MAX_CONTENT_LENGTH':                   None,
        'SEND_FILE_MAX_AGE_DEFAULT':            timedelta(hours=12),
        'TRAP_BAD_REQUEST_ERRORS':              False,
        'TRAP_HTTP_EXCEPTIONS':                 False,
        'EXPLAIN_TEMPLATE_LOADING':             False,
        'PREFERRED_URL_SCHEME':                 'http',
        'JSON_AS_ASCII':                        True,
        'JSON_SORT_KEYS':                       True,
        'JSONIFY_PRETTYPRINT_REGULAR':          True,
        'JSONIFY_MIMETYPE':                     'application/json',
        'TEMPLATES_AUTO_RELOAD':                None,
    }

第一种方式

from flask import Flask
app = Flask(__name__)

app.debug = True  

@app.route('/')
def index():
    return 'ok3'

if __name__ == '__main__':
    app.run()
from flask import Flask
app = Flask(__name__)

app.debug = True  

@app.route('/')
def index():
    return 'ok3'

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

直接在文件中用 app.debug = True 设置开启DEBUG模式。开启后项目会自动重启。这种方式只能配置 debug 和 secret_key

第二种方式

from flask import Flask
app = Flask(__name__)

app.config['DEBUG'] = True   # 通过config配置

@app.route('/')
def index():
    return 'ok3'

if __name__ == '__main__':
    app.run()
from flask import Flask
app = Flask(__name__)

app.config['DEBUG'] = True   # 通过config配置

@app.route('/')
def index():
    return 'ok3'

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

第三种方式

from flask import Flask
app = Flask(__name__)

app.config.from_pyfile('settings.py')  # 将配置写在配置文件中

@app.route('/')
def index():
    return 'ok3'

if __name__ == '__main__':
    app.run()
from flask import Flask
app = Flask(__name__)

app.config.from_pyfile('settings.py')  # 将配置写在配置文件中

@app.route('/')
def index():
    return 'ok3'

if __name__ == '__main__':
    app.run()
settings.py文件
DEBUG = True
DEBUG = True

第四种方式

from flask import Flask
app = Flask(__name__)

app.config.from_object('settings.TestConfig')  # 将配置写在配置文件的类中,导入使用

@app.route('/')
def index():
    return 'oD3'

if __name__ == '__main__':
    app.run()
from flask import Flask
app = Flask(__name__)

app.config.from_object('settings.TestConfig')  # 将配置写在配置文件的类中,导入使用

@app.route('/')
def index():
    return 'oD3'

if __name__ == '__main__':
    app.run()
settings.py文件
class BaseConfig:
    SESSION_COOKIE_NAME = 'session' 

class TestConfig(BaseConfig):
    DEBUG = True

class WorkConfig(BaseConfig):
    DEBUG = False
class BaseConfig:
    SESSION_COOKIE_NAME = 'session' 

class TestConfig(BaseConfig):
    DEBUG = True

class WorkConfig(BaseConfig):
    DEBUG = False

这种配置比较推荐使用,因为以后在开发过程中需要不同环境下配置不同,可以通过引用不同的类来配置不同的参数

其他方式

# 通过环境变量配置
app.config.from_envvar("环境变量名称")
# app.config.from_pyfile(os.environ['YOURAPPLICATION_SETTINGS'])
环境变量的值为python文件名称名称,内部调用from_pyfile方法

app.config.from_json("json文件名称")
JSON文件名称,必须是json格式,因为内部会执行json.loads

app.config.from_mapping({'DEBUG': True})
字典格式
# 通过环境变量配置
app.config.from_envvar("环境变量名称")
# app.config.from_pyfile(os.environ['YOURAPPLICATION_SETTINGS'])
环境变量的值为python文件名称名称,内部调用from_pyfile方法

app.config.from_json("json文件名称")
JSON文件名称,必须是json格式,因为内部会执行json.loads

app.config.from_mapping({'DEBUG': True})
字典格式