• 配置文件、路由、模板


    配置文件

    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.config['DEBUG'] = True
     
        PS: 由于Config对象本质上是字典,所以还可以使用app.config.update(...)
     
    方式二:
        app.config.from_pyfile("python文件名称")
            如:
                settings.py
                    DEBUG = True
     
                app.config.from_pyfile("settings.py")
     
        app.config.from_envvar("环境变量名称")
            环境变量的值为python文件名称名称,内部调用from_pyfile方法
     
     
        app.config.from_json("json文件名称")
            JSON文件名称,必须是json格式,因为内部会执行json.loads
     
        app.config.from_mapping({'DEBUG':True})
            字典格式
     
        app.config.from_object("python类或类的路径")
     	如:
            app.config.from_object('pro_flask.settings.TestingConfig')
        
        	settings.py
     
                class Config(object):
                    DEBUG = False
                    TESTING = False
                    DATABASE_URI = 'sqlite://:memory:'
     
                class ProductionConfig(Config):
                    DATABASE_URI = 'mysql://user@localhost/foo'
     
                class DevelopmentConfig(Config):
                    DEBUG = True
     
                class TestingConfig(Config):
                    TESTING = True
     
            PS: 从sys.path中已经存在路径开始写
         
        PS: settings.py文件默认路径要放在程序root_path目录,如果instance_relative_config为True,则就是instance_path目录
    

    路由系统

    • @app.route('/user/<username>')
    • @app.route('/post/<int:post_id>')
    • @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,
    }
    
    @app.route('/index', methods=['GET', 'POST'], endpoint='n1')
    def index():
        print(url_for('n1'))
    	return 'Index'
    

    endpoint 就是 django 中的 name,通过它反向生成 URL,不写默认是函数名

    路由本质

    from flask import Flask
    
    app = Flask(__name__)
    app.debug = True
    app.secret_key = "dsagsd"
    
    '''
    第一步
    @app.route('/', methods=['GET', 'POST'], endpoint='n1')
        def route(self, rule, **options):       self是app对象
            # rule是 /
            # options 是 {methods=['GET', 'POST'], endpoint='n1'}
            def decorator(f):
                endpoint = options.pop('endpoint', None)
                self.add_url_rule(rule, endpoint, f, **options)
                return f
            return decorator    返回给上面的app.route
            
    第二步
    相当于写了一个 @decorator, 立即执行decorator函数
    即decorator(index), endpoint已经是n1
    然后执行self.add_url_rule(), self是app
    '''
    @app.route('/', methods=['GET', 'POST'], endpoint='n1')
    def index():
        return 'Hello World!'
    
    def login():
        return '登录'
    
    app.add_url_rule('/login', 'n2', login, methods=['GET', 'POST'])
    
    
    if __name__ == '__main__':
        app.run()
    

    CBV

    from flask import Flask, views
    
    def auth(func):
        def inner(*args, **kwargs):
            res = func(*args, **kwargs)
            return res
        return inner
    
    app = Flask(__name__)
    app.debug = True
    app.secret_key = "fdafsa"
    
    class IndexView(views.MethodView):
        methods = ['GET']
        decorators = [auth, ]
    
        def get(self):
            return 'Index.GET'
    
        def post(self):
            return 'Index.POST'
    
    app.add_url_rule('/index', view_func=IndexView.as_view(name='index'))   # name=endpoint
    
    
    if __name__ == '__main__':
        app.run()
    

    add_url_rude 参数

    @app.routeapp.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),访问 http://www.xx.com/index/ 或 http://www.xx.com/index 均可,
    @app.route('/index',strict_slashes=True),仅访问 http://www.xx.com/index 
    
    '''
    
    • redirect_to=None:重定向到指定地址
    # redirect_to:重定向到指定地址
    
    from flask import Flask
    
    app = Flask(__name__)
    app.debug = True
    app.secret_key = "dsagsd"
    
    @app.route('/index', methods=['GET', 'POST'], endpoint='n1', redirect_to="/index2")
    def index():
        return '公司旧页面'
    
    @app.route('/index2', methods=['GET', 'POST'], endpoint='n2')
    def index():
        return '公司新页面'
    
    if __name__ == '__main__':
        app.run()
    
    • subdomain=None:子域名访问
    # 子域名访问
    
    from flask import Flask, views, url_for
    
    app = Flask(import_name=__name__)
    app.config['SERVER_NAME'] = 'qiuxi.com:5000'
    
    @app.route("/", subdomain="admin")
    def static_index():
        """
        Flask supports static subdomains
        This is available at static.your-domain.tld
        """
        return "static.your-domain.tld"
    
    
    @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()
    

    支持正则的路由

    from flask import Flask, views, url_for
    from werkzeug.routing import BaseConverter
    
    app = Flask(import_name=__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
    
    # 添加到flask中
    app.url_map.converters['regex'] = RegexConverter
    
    
    @app.route('/index/<regex("d+"):nid>')
    def index(nid):
        print(url_for('index', nid='888'))
        return 'Index'
    
    
    if __name__ == '__main__':
        app.run()
    
    

    模板

    Flask 使用的是 Jinja2 模板,所以其语法和 Django 无差别

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <h1>自定义函数</h1>
        {{ ww()|safe }}		<!-- 与Django的区别是可以加括号,可以传参 -->
    
    </body>
    </html>
    
    from flask import Flask, render_template, Markup
    app = Flask(__name__)
     
    def qiuxi():
        # return Markup('<h1>qiuxi</h1>')	# 前端页面不加safe时使用
        return '<h1>qiuxi</h1>'
     
    @app.route('/login', methods=['GET', 'POST'])
    def login():
        return render_template('login.html', ww=qiuxi)
     
    if __name__ == '__main__':
        app.run()
    
  • 相关阅读:
    GLSL逐像素光照 【转】
    GLSL逐顶点光照[转]
    GLSL 基础量定义 【转】
    GLSL纹理贴图 【转】
    NormalMap 贴图 [转]
    glsl镜面水倒影的实现[转]
    C#调用C++Dll封装时遇到的一系列问题【转】
    在C#中使用C++编写的类——用托管C++进行封装[转]
    GEOS 使用的例子
    昌平区2015年义务教育阶段入学工作意见 (含非京籍)
  • 原文地址:https://www.cnblogs.com/qiuxirufeng/p/12094537.html
Copyright © 2020-2023  润新知