Flask配置文件和URL

Flask配置文件和URL

一、配置文件

Flask项目的配置,都是通过app.config对象来进行配置的。比如要配置一个项目的SECRET_KEY,那么可以使用app.config[‘SECRET_KEY’] = "xxx"来进行设置,在Flask项目中,有四种方式进行项目的配置:

1.1直接编码

app = Flask(__name__)
app.config['SECRET_KEY'] = "xxx"

1.2因为app.config是flask.config.Config的实例,而Config类是继承自dict,因此可以通过update方法:

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

1.3把所有的配置项都放在一个模块中,然后通过加载模块的方式进行配置,假设有一个settings.py模块,专门用来存储配置项的,此时你可以通过app.config.from_object()方法进行加载,并且该方法既可以接收模块的的字符串名称,也可以模块对象:

class BaseConfig(object):
    """基础配置"""
    SECRET_KEY = "asudflkjdfadjfakdf"


class ProductionConfig(BaseConfig):
    """生产环境"""
    DEBUG = False


class DevelopmentConfig(BaseConfig):
    """开发环境"""
    DEBUG = True


class TestingConfig(BaseConfig):
    """测试环境"""
    pass
# 1. 通过模块字符串
app.config.from_object('settings')
# 2. 通过模块对象
import settings
app.config.from_object(settings.BaseConfig)

1.4也可以通过另外一个方法加载,该方法就是app.config.from_pyfile(),该方法传入一个文件名,通常是以.py结尾的文件,但也不限于只使用.py后缀的文件

app.config.from_pyfile('settings.py',silent=True)
# silent=True表示如果配置文件不存在的时候不抛出异常,默认是为False,会抛出异常。

1.5flask中的配置文件是一个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,
    }
更新详细信息访问官方说明查看:https://flask.palletsprojects.com/en/2.0.x/config/

二、如何使用URL

2.1 什么是URL

url是统一资源定位符(Uniform Resource Locator的简写),对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。

url的组成

scheme://host:port/path/?parameter=xxx#anchor
https://www.baidu.com/Public/linux/?fr=aladdin#23

scheme:代表的是访问的协议,一般为http或者https以及ftp等。
host:主机名。域名,比如www.baidu.com。
port:端口号。当你访问一个网站的时候,浏览器默认使用80端口.
path:路径。比如: www.baidu.com/Publiclinux?python=aladdin#23,www.baidu.com后面的Public/linux就是path,o query-string: 查询字符串,比如: www.baidu.comIs?wd=python,?后面的python=aladdin就是查询字符串。
anchor: 锚点。后台一般不用管,前端用来做页面定位的。比如:https:/www.oldboyedu.com/PubliclinuxPRfr=aladin#23,#后面的23就是锚点

2.2 URL与路由的区别

  • 调用接口需要使用到具体的代码,url就是对调用代码的具体映射,通过url找到具体的代码,这便是url。
  • 路由是根据url定位到具体的代码或程序,这段程序我们称之为路由。

2.3 如何创建URL

  • 在Flask程序中使用路由我们称之为注册路由,是使用程序实例提供的app.route()装饰器注册路由,而括号内的字符串就是url,注册路由的过程就是完成了url和python类或函数映射的过程,url与代码形成对应关系。这样url访问fask就可以找到对应的代码。
@app.route('/')
def hello_world():
    return 'Hello World!'

2.4 URL传参的两种方式

动态路由传参:

在浏览中, 访问同一网址不同页面支持部分字符串发生了变化,例如:学生id
实现代码

@app.route('/student_list//')
def student_list(student_id):
    return '学生{}号的信息'.format(student_id)

Flask配置文件和URL_第1张图片
其中尖括号是固定写法,语法为,student_list默认的数据类型是字符串。
如果需要指定类型,则要写成converter:student_list,其中converter就是类型名称,
可以有以下几种:
string: 默认的数据类型,接受没有任何斜/的字符串。
int: 整形
float: 浮点型。
path: 和string类似,但是可以传递斜杠/。
uuid: uuid类型的字符串(唯一标识)。
any:可以指定多种路径

@app.route('///')
def item(url_path, id):
    if url_path == 'student':
        return '学生{}详情'.format(id)
    else:
        return '班级{}详情'.format(id)

Flask配置文件和URL_第2张图片

Flask配置文件和URL_第3张图片

  • 使用动态路由的好处:

1.增加网站的曝光率
2.有利于优化搜索引擎

查询字符传参:

如果在浏览器中输入www.baidu.com/s?wd=python&ad=flask 的参数,这个?后的key=value便是查询字符串,可以写多个key=value用&相连我们将查询字符串作为参数去请求我们的flask程序,这便是查询字符串传参。在之前再注册路由的时候会在里面的path部分以及函数的形参设置参数来接受path的参数,在查询字符串传参的时候需要从flask模块里面导入request对象,用request.args属性在程序中根据查询字符串的key取出查询字符串的value。arg 是reaest的一个属性,本质上是一个werkzeug依赖包的imutablelultivict的对象,用于解析传入的查询字符串,immutablelultiDict对象也继承了Dict类,所以可以使用字典的.get()方法来获取,如果有获取原生未解析的原生查询字符串的需求,可以使用query_string属性.

from flask import Flask,request
...
@app.route('/student_name/')
def school_name_list():
    name = request.args.get('name')
    age = request.args.get('age')
 
    return "学生的姓名为{},年龄为{}".format(name, age)

Flask配置文件和URL_第4张图片

2.5 url_for()的使用:

在访问一个网址的时候需要跳转到另一个页面时, 需要用到另外一个url,这时可以通过url_for()来实现

  • url_for()的原理:

    利用视图函数名字一般不会改变的特效, 利用视图函数的名字去动态精确获取url,一边去开发时使用.

    url_for(‘视图函数名字’) # 输出该视图函数url

举例:

from flask import Flask,url_for
 
app = Flask(__name__)
app.config.update(DEBUG=True)
 
@app.route('/')
def demo1():
    print(url_for("book"))  # 注意这个引用的是视图函数的名字 字符串格式
    print(type(url_for("book")))
 
    return url_for("book")
 
@app.route('/book_list/')
def book():
    return 'flask_book'
 
if __name__ ==  "__main__":
    app.run()

Flask配置文件和URL_第5张图片

Flask配置文件和URL_第6张图片

  • url_for()处理动态视图函数
    案例:
@app.route('/demo2/')
def demo2():
    student_url = url_for('student', id=5, name='mark')  # i在这里写上参数进行复制
    print(student_url)

    return student_url


@app.route('/student//')
def student(id):
    return 'student {}'.format(id)

Flask配置文件和URL_第7张图片

  • url_for()处理查询字符串, 只要在url_for()里面做为参数,url_for()会自动拼接
    案例:
@app.route('/demo3/')
def demo3():
    school_url = url_for('school', school_level='high', name='college') 
    # 具体要拼接的查询参数 以关键字实参的形式写在url_for里
    print(school_url)
 
    return school_url
 
@app.route('/school/')
def school():
 
    return 'school message'

Flask配置文件和URL_第8张图片

2.5 自定义动态路由

在Flask中可以通过werkzeug.routing模块的BaseConverter类来定义一个所需要的的过滤规则
例如:手机号

from flask import Flask,request
from werkzeug.routing import BaseConverter
 
app = Flask(__name__)
app.debug =True
 
class UserPhoneConverter(BaseConverter):
    regex = '1[3857]\d{9}' #右下斜杠d
 
app.url_map.converters['phone'] = UserPhoneConverter


@app.route('/user//')
def student_detail(user_phone):
    return '用户的手机号码是{}'.format(user_phone)
 
if __name__ == '__main__':
    app.run()

ps:
    1.自定义动态路由必须继承BaseConverter类
    2.通过regex属性指定路由规则
    3.自定义的累需映射到app.url_map.converters中
        app_url.converters['phone'] = UserPhoneConverter

Flask配置文件和URL_第9张图片

Flask配置文件和URL_第10张图片

自定义动态路由

from flask import Flask,request,url_for
from werkzeug.routing import BaseConverter
 
app = Flask(__name__)
app.debug =True
 
class ListConverter(BaseConverter):
    regex = '.*'     # 这个regex代表都匹配的意思,可以根据自己的需求制定url规则
    def to_python(self, value):
        '''这个函数用于拿到了路由里的动态参数赋值给value,
          可以在to_python进行操作动态参数,
          返回操作完的的结果给视图函数的形参'''
        return value.split('+')
 
    def to_url(self, value):
        '''这个函数用于和url_for连用,
           url_for通过指定给动态参数(以关键字实参的形式)赋值给value
           我们可以根据我们的需求操作url_for传进来的参数,
           然后返回一个理想的动态路由内容拼接在url上'''
        return '+'.join(value)
 
app.url_map.converters['list'] = ListConverter
 
@app.route('/student_list//')
def student_list(students):
    print(url_for('student_list',students=['a','b'])) # 输出 /student_list/a+b/
 
    return '{}'.format(students)
 
if __name__ == '__main__':
    app.run()

Flask配置文件和URL_第11张图片

在这里插入图片描述

2.7 endpoint介绍

endpoint参数是写在注册路由中的一个参数, 学名叫端点, 我们可以理解为函数的别名, 当我没的url太长时, 可以使用别来来结合url_for()使用
举例:

@app.route('/end_test/',endpoint='as')
def end_test():
    endp_demo = url_for('as')
    return '利用视图函数别名返回url:{}'.format(endp_demo)

Flask配置文件和URL_第12张图片

2.8 注册路由源码解析

  • 1.源码
def route(self, rule: str, **options: t.Any) -> t.Callable[[F], F]:
    def decorator(f: F) -> F:
        endpoint = options.pop("endpoint", None)
        self.add_url_rule(rule, endpoint, f, **options)
        return f

    return decorator
  • 2.解析
1.发现在route()返回的decorator函数地址, 然后基于装饰器语法的原理,decorator会加括号运行:decorator(视图函数名)
2.decorator函数中首先取出endpoint, 然后运行self.add_url_rule(rule, endpoint, f, **options)
所以self.add_url_rule(rule, endpoint, f, **options)就是注册路由的和兴

2.9 视图函数中添加自定义装饰器

from flask import Flask, request
from functools import wraps

app = Flask(__name__)


def login_verify(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        user_name = request.args.get('user')
        user_pwd = request.args.get('pwd')
        if user_name == 'input-name' and user_pwd == '123':
            return func(*args, **kwargs)
        else:
            return '请登录'

    return wrapper


@app.route('/')
def hello_world():
    return 'Hello World'


@app.route('/my_info/')
@login_verify
def my_info():
    return '个人信息页面'
注意:
1.装饰器一定要写在注册路由的下面, 写在视图函数的上面
2.装饰器内部一定要使用@wraps(func)方法, 用于保护装饰器函数的属性

你可能感兴趣的:(flask,flask,python)