配置文件系统

构建 Flask 应用时指定

app = Flask(
__name__,
template_folder = '',  # 指定存储模板文件夹名称
static_url_path = '',  # 指定静态文件访问路径
static_folder = '',   # 指定存储静态文件的文件夹名称
)

一般不推荐修改此配置. 默认的配置即可

启动程序时指定运行配置

app.run(
  debug = True,    # 调试模式
  port = 8888      # 端口
  host = '0.0.0.0'  # 指定能够访问到本项目的ip地址,不设置此的话只能自己和自己玩
)

自定义配置文件

创建一个 setting.py 用于存放配置文件的相关属性

配置文件中可以进行分级继承来区分不同视图的配置文件设置

默认配置文件放在项目根路径下

# settings.py

    class Base(object):    # 所有的都要有用到的配置更改
TEST = True class Dev(Base):
DEV = True class Pro(Base):
PRO = True

配置文件的设置方式

常用的是以下三种

# 方式1 直接更改
app.config["要更改的字段"] = True

# 方式2 指定对象方式
# app.config.from_object("settings.Dev") # 通过另外指定配置文件来保存更改
app.config.from_object("settings.Pro") # 可以指定多套配置文件随意切换 # 方式3 指定文件方式
app.config.from_pyfile("settings.py") # 通过配置文件名来
# PS: 从sys.path中已经存在路径开始写
 

默认的配置文件

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来拿。

但是如果视图函数和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"

路由系统

FBV 的路由添加方式

语法

@app.route(参数)

可选参数

rule

设置动态路由,路径中可以带参数 ,必须要指定类型

/index/<int:nid>

仅允许的类型

  • string 字符串
  • float 浮点型
  • path 路径
  • int 整型
  • any 任何
  • uuid uuid类型

默认的不支持正则路由匹配的

默认不指定的时候按str 处理

实例

from flask import Flask

# 将当前的运行的主程序构建成 Flask 应用, 以便去接受用户的请求和响应
app = Flask(__name__) # 路由定义, 目的是为了匹配用户的访问路径
# "/" 表示整个网站的根 " index " 表示自定义的访问路径
# index() 表示匹配上访问路径后的处理程序( views ), 此函数必须要有返回值 ( 字符串 / 模板文件 )
@app.route('/index')
def index():
return "<h1> 这是我的网站的首页 </h1>" # 无参数
@app.route('/')
def first():
return "This is my first flask demo" # 单参数
@app.route('/name/<name>')
def name(name):
return "This is {0} first flask".format(name) # 带类型的参数
@app.route('/num/<int:num>')
def num(num):
return "get a unm: {0} ".format(num) """
可选的参数类型
str: 字符串,不能加 "/"
int: 整数
float: 浮点型
path: 路径,本质还是字符串, 但是可以加 "/"
不推荐使用 path 容易误解
""" # 多参数
# str 类型不需要加 <str:...>
@app.route('/more/<name>/<int:age>')
def more(name, age):
return " name : {name} ; age: {age}".format(name=name, age=age)
# return "name: %s ; age : %s" % (name, age) if __name__ == '__main__':
# debug = True # 调试模式, 部署运行是设置为 False
app.run(debug=True) # 启动程序

多 URL 的路由匹配方式

允许多个路由匹配到同一个 视图上

@app.route('/manyA/')
@app.route('/manyB/')
@app.route('/manyC/')
def many():
return "我可以匹配多个URL , 厉害吧"

URL 中适配正则的验证方式

from flask import Flask,url_for

    app = Flask(__name__)

    # 定义转换的类
from werkzeug.routing import BaseConverter
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) #反向生成,就会去执行to_url方法
return "Index" if __name__ == '__main__':
app.run()

default 添加默认值示例

from flask import Flask

app = Flask(__name__)

# 2. 函数index需要参数,但是url里无参数,即可以用defaults={"k":"v"}为函数提供参数
@app.route("/",methods=['GET','POST'],defaults={"nid":888})
# 1. 函数index需要参数,但是url里无参数
def index(nid):
print(nid) # 会在工作它打印nid 888
return "Hello World!" if __name__ =="__main__":
app.run()

strict_slashes “/” 示例

@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 重定向示例

原url有参数时,跳转是也得传参,注意:不用加类型

#/old
@app.route('/old/<int:nid>',redirect_to="/new/<nid>")
def old(nid):
return "old"
# /new
@app.route('/new/<int:nid>')
def new(nid):
return "new"

subdomain 子域名示例

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():
return "admin.xxx.com"

#动态生成
@app.route("/dynamic", subdomain="<username>")
def username_index(username):
return username + ".your-domain.tld" if __name__ == '__main__':
app.run()

路由系统的本质

通过源码分析。
@app.route()的本质就是执行了 add_url_rule(rule,endpoint,f,**options) 方法
因此我们也可以在这里操作也可以添加路由映射 主流并不是用这种。就装饰器就可以了

from flask import Flask

app = Flask(__name__)
app.config.from_object("settings.DevelopmentConfig") '''
看到路由系统,分析路由系统干了什么?
第一步:先执行:decorator = app.route("/", methods= ['GET','POST'], endpoint='n1')
根据源码,第一步执行了下面的函数,返回decorator,这就是一个闭包,闭包给谁用,谁以后执行这个函数就给谁用
def route(self, rule, **options):
# 具体值与参数的对应关系:
# 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
第二步: 第一步返回了decorator,所以相当于是: @decorator,等价于decorator(index),触发上面route函数下面的decorator函数的运行
def decorator(f):
endpoint = options.pop('endpoint', None)
self.add_url_rule(rule, endpoint, f, **options) # self就是app对象。加到了路由的对应表里去了,那里有url对应的函数
return f 最后总结一下,添加路由关系的本质,其实就是最终执行 self.add_url_rule(rule, endpoint, f, **options),生成路由的对应关系 '''
# 对于endpoint还要注意:
# 如果endpoint没有写,根据源码可知,默认的就是函数名,即该路由对应函数,如index(endpoint = index)
@app.route("/", methods= ['GET','POST'], endpoint='n1')
def index():
return "Hello World!" def login():
return "登录" # 所以根据源码的原理,也可以按照下面的方式添加路由对应关系,就与Django类似了。但是在Flask里,还是要按照装饰器的方式去添加路由对应关系
app.add_url_rule('/login', 'n2', login, methods= ['GET','POST']) if __name__ == "__main__":
app.run()

CBV 的路由添加方式

def auth(func):
def inner(*args, **kwargs):
result = func(*args, **kwargs)
return result
return inner class IndexView(views.MethodView):
# methods = ['POST'] #只允许POST请求访问
decorators = [auth,] #如果想给所有的get,post请求加装饰器,就可以这样来写,也可以单个指定 def get(self): #如果是get请求需要执行的代码
v = url_for('index')
print(v)
return "GET" def post(self): #如果是post请求执行的代码
return "POST" app.add_url_rule('/index', view_func=IndexView.as_view(name='index')) #name指定的是别名,会当做endpoint使用

11.2 Flask 配置文件,路由系统的更多相关文章

  1. Flask中路由系统以及蓝图的使用

    一.Flask的路由系统 1.@app.route()装饰器中的参数 methods:当前URL地址,允许访问的请求方式 @app.route("/info", methods=[ ...

  2. Flask最强攻略 - 跟DragonFire学Flask - 第七篇 Flask 中路由系统

    Flask中的路由系统其实我们并不陌生了,从一开始到现在都一直在应用 @app.route("/",methods=["GET","POST" ...

  3. Flask 的路由系统 FBV 与 CBV

    Flask的路由系统 本质: 带参数的装饰器 传递函数后 执行 add_url_rule 方法 将 函数 和 url 封装到一个 Rule对象 将Rule对象 添加到 app.url_map(Map对 ...

  4. Flask - 四剑客 | templates | 配置文件 | 路由系统 | CBV

    Flask框架简介 说明:flask是一个轻量级的web框架,被称为微型框架.只提供了一个高效稳定的核心,其它全部通过扩展来实现.意思就是你可以根据项目需要进行量身定制,也意味着你需要不断学习相关的扩 ...

  5. 源码解析flask的路由系统

    源码解析flask的路由系统 当我们新建一个flask项目时,pycharm通常已经为项目定义了一个基本路由 @app.route('/') def hello_world(): return 'He ...

  6. 第七篇 Flask 中路由系统以及参数

    Flask中的路由系统其实我们并不陌生了,从一开始到现在都一直在应用 @app.route("/",methods=["GET","POST" ...

  7. 第七篇 Flask 中路由系统

    1. @app.route() 装饰器中的参数 如果不明白装饰器 点击这里 methods : 当前 url 地址,允许访问的请求方式 @app.route("/info", me ...

  8. 7,Flask 中路由系统

    Flask中的路由系统 @app.route("/",methods=["GET","POST"]) 为什么要这么用?其中的工作原理我们知道 ...

  9. flask框架路由系统

    flask框架的url系统: flask框架的路由系统: flask框架的路由系统使用实例化的route方法来指定: 如: @app.route('/') route函数装饰器可以把一个函数绑定到对应 ...

随机推荐

  1. #WEB安全基础 : HTML/CSS | 0x10.1更多表单

    来认识更多的表单吧,增加知识面 我只创建了一个index.html帮助你认识它们 以下是代码 <!DOCTYPE html> <html> <head> <m ...

  2. Dynamics CRM项目实例之八:CRM 2015的产品系列,克隆,修订

    关注本人微信和易信公众号: 微软动态CRM专家罗勇,回复139或者20150106可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me!       今天的博客主要是关于D ...

  3. 国人如此浮躁为哪般? --- 我看2018年度AI圈八大造假事件华人独占6件

    国人如此浮躁为哪般? ---  我看2018年度AI圈八大造假事件华人独占6件 人工智能在2018年发展很快,取得了很多成绩:很多新的产品,框架,软硬件系统,层出不穷:以七巨头为首的业界头部企业也取得 ...

  4. Android Fragment的用法(一)

    1.碎片是什么 碎片(Fragment)是一种可以嵌入在活动当中的UI片段,它能让程序更加合理和充分地利用大屏幕的空间,因而在平板上应用的非常广泛.虽然碎片对你来说应该是个全新的概念,但我相信你学习起 ...

  5. MAC MAMP 中安装配置使用 ThinkPHP

    MAMP PRO 是Mac OS X 平台上经典的本地环境应用 MAMP 的专业版.专门为专业的Web开发人员和程序员轻松地安装和管理自己的开发环境. MAMP这几个首字母代表Mac OS X系统上的 ...

  6. 第五周课后作业——热门软件创新分析+附加题1&附加题3

    鉴于我们寝室都热衷于手游,所以本次热门软件创新分析我就来分析一下几款热门的抽卡型手游.   阴阳师(后文简称YYS)——剧情画风唯美,配音引人入胜 作为网易公司研发的一款3D日式和风回合制游戏,YYS ...

  7. C#-this关键字的功能之扩展方法

    目录 1. 简介 2. 简单实例 3. 细节说明 1. 简介 我们的方法都是与声明他的类的相关联(我们现在写的各个方法都是在类中定义,所以我们调用方法都是用该方法所属类的实体对象调用). 在C#3.0 ...

  8. Python(五)模块

    本章内容: 模块介绍 time & datetime random os sys json & picle hashlib XML requests ConfigParser logg ...

  9. LeetCode算法题-Search in a Binary Search Tree(Java实现)

    这是悦乐书的第295次更新,第314篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第163题(顺位题号是700).给定一个二叉搜索树(BST)的和正整数val. 你需要在 ...

  10. 【Teradata UDF】中文按字符查找chs_instr

    一.场景描述 数据库为ASCII编码单字节存储,在查询中文时可能会出现错误结果.例如查询like“房”字,会查询出不含“房”,含“朔科”的结果. select * from Tablename01 w ...