Flask的配置与路由

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> Flask的配置与路由

点击上方”python宝典”,关注获取python全套视频,

技术文章第一时间送达!

配置管理


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,
    }

复杂的项目需要配置各种环境。如果设置项很少,可以直接硬编码进来,比如下面的方式:


app = Flask(__name__)
app.config['DEBUG'] = True

app.config是flask.config.Config类的实例,继承自Python内置数据结构dict,所以可以使用update方法:


app.config.update(
    DEBUG = True,
    ...
)

app.config内置的全部配置变量可以参看Builtin Configuration Values。如果设置选项很多,想要集中管理设置项,应该将他们存放到一个文件里面。app.config支持多种更新配置的方式。假设现在有个叫做settings.py的配置文件,其中的内容如下:


A = 1

可以选择如下三种方式加载:

通过配置文件加载


# 通过模块名的字符串
app.config.from_object('settings')  
# 或者:
import settings
app.config.from_object(settings)

通过文件名字加载。但是不限于只使用.py后缀的文件名


# slient=True该文件不存在时不抛异常,返回False,默认是会抛出异常
app.config.from_pyfile('settings.py',slient=True)

总结


==========方式一:============
 app.config['SESSION_COOKIE_NAME'] = 'session_lvning'  #这种方式要把所有的配置都放在一个文件夹里面,看起来会比较乱,所以选择下面的方式
==========方式二:==============
app.config.from_pyfile('settings.py')  #找到配置文件路径,创建一个模块,打开文件,并获取所有的内容,再将配置文件中的所有值,都封装到上一步创建的配置文件模板中

print(app.config.get("CCC"))
=========方式三:对象的方式============
 import os 
 os.environ['FLAKS-SETTINGS'] = 'settings.py'
 app.config.from_envvar('FLAKS-SETTINGS') 

===============方式四(推荐):字符串的方式,方便操作,不用去改配置,直接改变字符串就行了 ==============
app.config.from_object('settings.DevConfig')

----------settings.DevConfig----------
from app import app
class BaseConfig(object):
    NNN = 123  #注意是大写
    SESSION_COOKIE_NAME = "session_sss"

class TestConfig(BaseConfig):
    DB = "127.0.0.1"

class DevConfig(BaseConfig):
    DB = "52.5.7.5"

class ProConfig(BaseConfig):
    DB = "55.4.22.4"

要想在视图函数中获取配置文件的值,都是通过app.config来拿。但是如果视图函数和Flask创建的对象app不在一个模块。就得通过导入来拿。可以不用导入。直接导入一个current_app,这个就是当前的app对象,用current_app.config就能查看到了当前app的所有的配置文件


from flask import Flask,current_app

@app.route('/index',methods=["GET","POST"])
def index():
    print(current_app.config)   #当前的app的所有配置
    session["xx"] = "fdvbn"
    return "index"

路由系统

1.可传入参数:


@app.route('/user/username')   #常用的   不加参数的时候默认是字符串形式的
@app.route('/post/int:post_id')  #常用的   #指定int,说明是整型的
@app.route('/post/float:post_id')
@app.route('/post/path:path')
@app.route('/login', methods=['GET', 'POST'])

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

2.反向生成URL: url_for

endpoint(“name”)   #别名,相当于django中的name


from flask import Flask, url_for

@app.route('/index',endpoint="xxx")  #endpoint是别名
def index():
    v = url_for("xxx")
    print(v)
    return "index"

@app.route('/zzz/int:nid',endpoint="aaa")  #endpoint是别名
def zzz(nid):
    v = url_for("aaa",nid=nid)
    print(v)
    return "index2"

3.  @app.route和app.add_url_rule参数


@app.route和app.add_url_rule参数:
            rule,                       URL规则
            view_func,                  视图函数名称
            defaults=None,              默认值,当URL中无参数,函数需要参数时,使用defaults={'k':'v'}为函数提供参数
            endpoint=None,              名称,用于反向生成URL,即: url_for('名称')
            methods=None,               允许的请求方式,如:["GET","POST"]


            strict_slashes=None,        对URL最后的 / 符号是否严格要求,
                                        如:
                                            @app.route('/index',strict_slashes=False), #当为False时,url上加不加斜杠都行
                                                访问 http://www.xx.com/index/ 或 http://www.xx.com/index均可
                                            @app.route('/index',strict_slashes=True)  #当为True时,url后面必须不加斜杠
                                                仅访问 http://www.xx.com/index 
            redirect_to=None,           由原地址直接重定向到指定地址,原url有参数时,跳转到的新url也得传参,注意:新url中不用指定参数类型,直接用旧的参数的类型
                                        如:
                                            @app.route('/index/int:nid', redirect_to='/home/nid') # 访问index时,会直接自动跳转到home,执行home的函数,
                                                            不执行index的

                          或
                                            def func(adapter, nid):
                                                return "/home/888"
                                            @app.route('/index/int:nid', redirect_to=func)

            subdomain=None,             子域名访问
                                                from flask import Flask, views, url_for

                                                app = Flask(import_name=__name__)
                                                app.config['SERVER_NAME'] = 'haiyan.com:5000'


                                                @app.route("/", subdomain="admin")
                                                def static_index():
                                                    """Flask supports static subdomains
                                                    This is available at static.your-domain.tld"""
                                                    return "admin.xxx.com"

                            #动态生成
                                                @app.route("/dynamic", subdomain="username")
                                                def username_index(username):
                                                    """Dynamic subdomains are also supported
                                                    Try going to user1.your-domain.tld/dynamic"""
                                                    return username + ".your-domain.tld"


                                                if __name__ == '__main__':
                                                    app.run()
        所有的域名都得与IP做一个域名解析:
        如果你想通过域名去访问,有两种解决方式:
          方式一:
            1、租一个域名   haiyan.lalala
            2、租一个公网IP  49.8.5.62
            3、域名解析:
                           haiyan.com    49.8.5.62
            4、吧代码放在49.8.5.62这个服务器上,程序运行起来
              用户可以通过IP进行访问
          方式二:如果是自己测试用的就可以用这种方式。先在自己本地的文件中找
             C:WindowsSystem32driversetc  找到HOST,修改配置
            然后吧域名修改成自己的本地服务器127.0.0.1
            加上配置:app.config["SERVER_NAME"] = "haiyan.com:5000"



# =============== 子域名访问============
@app.route("/static_index", subdomain="admin")
def static_index():
    return "admin.bjg.com"

# ===========动态生成子域名===========
@app.route("/index",subdomain='xxxxx')
def index(xxxxx):
    return "%s.bjg.com" %(xxxxx,)

4.自定制正则路由匹配

扩展Flask的路由系统,让他支持正则,这个类必须这样写,必须去继承BaseConverter


from flask import Flask,url_for
from werkzeug.routing import BaseConverter
    app = Flask(__name__)

    # 定义转换的类  class RegexConverter(BaseConverter):
        """
        自定义URL匹配正则表达式
        """

        def __init__(self, map, regex):
            super(RegexConverter, self).__init__(map)
            self.regex = regex

        def to_python(self, value):
            """
            路由匹配时,匹配成功后传递给视图函数中参数的值
            :param value: 
            :return: 
            """
            return int(value)

        def to_url(self, value):
            """
            使用url_for反向生成URL时,传递的参数经过该方法处理,返回的值用于生成URL中的参数
            :param value: 
            :return: 
            """
            val = super(RegexConverter, self).to_url(value)
            return val

    # 添加到converts中
    app.url_map.converters['regex'] = RegexConverter

    # 进行使用
    @app.route('/index/regex("d+"):nid',endpoint='xx')
    def index(nid):
        url_for('xx',nid=123) 
        return "Index"

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

http://docs.jinkan.org/docs/flask/views.html
https://aliang.org/Python/Flask-route.html

原文链接:

https://www.cnblogs.com/huchong/p/8227606.html

Flask的配置与路由

识别图中二维码,欢迎关注python宝典

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> Flask的配置与路由


  转载请注明: 好好学java Flask的配置与路由

 上一篇
Flask快速入门,知识整理 Flask快速入门,知识整理
点击上方”python宝典”,关注获取python全套视频, 技术文章第一时间送达! 一、Flask介绍(轻量级的框架,非常快速的就能把程序搭建起来)Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服
2021-04-05
下一篇 
Flask视图函数与模板语法 Flask视图函数与模板语法
点击上方”python宝典”,关注获取python全套视频, 技术文章第一时间送达! 1.Django中的CBV模式 2.Flask中的CBV和FBV def auth(func): def inner(*args, **kwar
2021-04-05