日志
书接上文,在一个风和日丽的早晨,我拖着在地铁上被漂亮妹妹挤扁的身躯来到了公司,调好座椅靠背,准备好冰镇快乐水,戴上黑框眼镜,一个勤勤恳恳打工人就出现在了公司里,正准备度过一个美好(摸鱼)的工作日,我如往常一样打开vscode和pycharm,顺手打开ppt,准备像往常一般,一边挂着一边摸鱼自学,Flask内容不少,我也学的很认真,丝毫没有意识到老板此刻已经站在我的背后,他也不出声,就这么看着我自学Flask,在我学完一小节之后突然冷不丁冒出一句“怎么,准备跑路了?”。而此刻我还以为是平时的损友同事,于是乐呵呵的回头和他说? “开玩笑,过会我就rm -rf /* 给大伙放放。。”而当我发现原来是老板时,我的思绪在0.001秒飘向了很远很远,果不其然,被老板骂了四分之一柱香那么久,那真是一段漫长的时间。不说了,等我学好了Flask,我就把老板炒了。
Flask的配置文件与路由
什么是配置文件?
就是当程序调用的一些参数,文件路径,方法或者类放到一个文件中,当下次需要修改的一个参数的时候,不用再从所有关联的程序中找到该参数挨个修改,比较繁琐。像Django中,程序启动的时候需要加载setting.py文件,该文件配置包含中间件,数据库链接,文件路径,静态文件模板路径等参数,当视图函数链接数据库或创建静态文件的时候根据配置文件找到参数即可进行链接或创建文件等等操作,修改
也是如此,只要找到参数修改配置参数即可。
配置文件的实现方式:
flask中的配置文件是一个flask.config.Config对象(继承字典),默认配置为:
default_config = ImmutableDict({
'DEBUG': get_debug_flag(default=False),
'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,
})
手写配置类(推荐)
class BaseConfig(object):
DEBUG =True
SECRET_KEY ="adsaudiada"
class ProductionConfig(BaseConfig):
DEBUG = False
class DevelopmentConfig(BaseConfig):
pass
class TestingConfig(BaseConfig):
pass
什么是路由?router和route的区别?什么是服务器端路由?
①答:简单来说,路由就是URL到函数的映射。
②答:route就是一条路由,它将一个URL路径和一个函数进行映射 而 router 可以理解为一个容器,或者说一种机制,它管理了一组 route
③答:对于服务器来说,当接收到客户端发来的HTTP请求,会根据请求的URL,来找到相应的映射函数,然后执行该函数, 并将函数的返回值发送给客户端。对于最简单的静态资源服务器,可以认为,所有URL的映射函数就是一个文件读取操作。 对于动态资源,映射函数可能是一个数据库读取操作,也可能是进行一些数据的处理,等等。
Flask创建路由的两种方法(主要看源码)
from flask import Flask,render_template,redirect
app=Flask(__name__) #实例化对象
'''
1.执行 decorator=@app.route('/index',method=['GET','POST'])
2. @decorator
-新 index = decorator (index)
'''
#路由方式一:
@app.route('/index',methods=['GET','POST']) #调用了route方法 会返回函数 def decorator(f: t.Callable) -> t.Callable:
def index():
return "Index"
#路由方式二:
def order():
return "Order"
app.add_url_rule('/order',view_func=order)
if __name__ == '__main__':
app.run()
Flask函数反向生成url
'''
反向生成url 可以
'''
from flask import Flask,render_template,redirect,url_for
app=Flask(__name__) #实例化对象
@app.route('/index',methods=['GET','POST'],endpoint='n1')
def index():
v1=url_for('n1')
v2 =url_for('n2')
v3 =url_for('n3') #起别名
print(v1,v2,v3)
return "Index"
@app.route('/login',methods=['GET','POST'])
def login():
return "login"
@app.route('/logout',methods=['GET','POST'])
def lohout():
return "logout"
if __name__ == '__main__':
app.run()
Flask自定路由转换
'''
Flask框架之自定义路由转换器
路由传参
以及自定义正则表达式参数
'''
from flask import Flask,render_template,redirect,url_for
from werkzeug.routing import BaseConverter
app=Flask(__name__) #实例化对象
class RegexConverter(BaseConverter): #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
app.url_map.converters['regex'] =RegexConverter #告诉Flask 我要定义一个转换器了 名字为regex
@app.route('/index/<regex("\d+"):nid>',methods=['GET','POST'])
def index(nid):
print(nid,type(nid))
url_for('index',nid=999)#/index/999
return "Index"
if __name__ == '__main__':
app.run()
Flask? ? ? ? @app,route()中的函数
Flask中的@app.route()中的参数
methods = [ ]: | 当前url地址,允许访问的请求方式 类型为可迭代对象,允许八种http请求方式 | endpoint = “ ” | 路由Mapping地址对应视图函数,有点类似于django中的别名 | strict_slashes=True | url地址结尾符“ / ”的控制False: 无论结尾 “ / ” 是否存在均可以访问, True: 结尾不允许是“ / ”, 类似与django中的APPEND_SLASH | defaults={} | 视图函数的参数默认值 | redirect_to=“/index” | url地址重定向, 浏览器的请求返回为308
301和308都是永久重定向, 区别在于
301 在重定向时允许改变请求方法
308 在重定向时不允许改变请求方法,比如post请求被重定向时,redirect_to的url也为post请求方式,而301就有可能变成了get请求 |
兄弟们加油!删库跑路指日可待?
|