代码地址: https://github.com/1515806183/flask-code.git

路由

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
  1. # -*- coding: utf-8 -*-  
  2. from flask import Flask, url_for  
  3.                 
  4. app = Flask(__name__)  
  5.                 
  6.                 
  7. @app.route('/index/<int:year>/<string:mon>', endpoint='index'defaults={"name": 'peach', },  
  8.            strict_slashes=Falseredirect_to='https://www.baidu.com/')  
  9. def index(name, year, mon):  
  10.     """  
  11.     endpoint:                        相当于url_for,默认函数的名, url_for 反向地址,通过视图函数名,或者endpoint 解析出对应的url  
  12.     defaults                       设置默认参数  name  
  13.     strict_slashes                 严格匹配路径  
  14.     redirect_to                    永久重定向,301 不经过视图函数,302重定向是经过视图函数  
  15.     /index/<int:year>/<string:mon> 动态路由参数,数字可以转字符串字符串不能转数字  
  16.     :return:  
  17.     """  
  18.     return 'index'  
  19.                 
  20.                 
  21. app.run(host='0.0.0.0'debug=True)

                 

    实例化配置

  22. # -*- coding: utf-8 -*-  
  23. from flask import Flask, render_template  
  24.                 
  25. app = Flask(__name__,  
  26.             template_folder='templates',  # 默认模板路径  
  27.             static_folder='statics',  # 设置静态目录,默认是前面加个/, /statics  
  28.             static_url_path='/static', # 静态目录访问路径,这个意思是,访问它就是访问静态目录,必须带/ == "/" + static_folder  
  29.             )  
  30.                 
  31. app.config['DEBUG'] = True  
  32.                 
  33.                 
  34. @app.route('/')  
  35. def index():  
  36.     return render_template('index2.html')  
  37.                 
  38.                 
  39. app.run(host='0.0.0.0')  

                 

    其他配置

  40. static_folder = 'static',     # 静态文件目录的路径 默认当前项目中的static目录  
  41. static_host = None,           # 远程静态文件所用的Host地址,默认为空  
  42. static_url_path = None,       # 静态文件目录的url路径 默认不写是与static_folder同名,远程静态文件时复用  
  43.                 
  44. # host_matching是否开启host主机位匹配,是要与static_host一起使用,如果配置了static_host, 则必须赋值为True  
  45. 这里要说明一下,@app.route("/",host="localhost:5000"就必须要这样写  
  46. host="localhost:5000" 如果主机头不是 localhost:5000 则无法通过当前的路由  
  47.                 
  48. host_matching = False,            # 如果不是特别需要的话,慎用,否则所有的route 都需要host=""的参数  
  49. subdomain_matching = False,       # 理论上来说是用来限制SERVER_NAME子域名的,但是目前还没有感觉出来区别在哪里  
  50. template_folder = 'templates'     # template模板目录默认当前项目中的 templates 目录  
  51. instance_path = None,             # 指向另一个Flask实例的路径  
  52. instance_relative_config = False  # 是否加载另一个实例的配置  
  53. root_path = None                  # 主模块所在的目录的绝对路径,默认项目目录 

                 

    对象配置

  54. # -*- coding: utf-8 -*-  
  55. from flask import Flask  
  56. app = Flask(__name__)  
  57.                 
  58. 对象配置  
  59. app.secret_key = 'ytyttyt'  
  60. app.config['SECRET_KEY'] = 'frfrvr'  
  61. app.config['DEBUG'] = True  
  62.                 
  63. @app.route('/')  
  64. def index():  
  65.     return 'index'  
  66.                 
  67. app.run(host='0.0.0.0'

                 

    配置参数

  68. {  
  69.     'DEBUG': False,                      # 是否开启Debug模式  
  70.     'TESTING': False,                    # 是否开启测试模式  
  71.     'PROPAGATE_EXCEPTIONS': None,        # 异常传播(是否在控制台打印LOG) Debug或者testing开启后,自动为True  
  72.     'PRESERVE_CONTEXT_ON_EXCEPTION': None,  # 一两句话说不清楚,一般不用它  
  73.     'SECRET_KEY': None,                  # 之前遇到过,在启用内置Session的时候/flash闪现的时候,一定要有它  
  74.     'PERMANENT_SESSION_LIFETIME': 31,    # days , Session的生命周期()默认31  
  75.     'USE_X_SENDFILE': False,             # 是否弃用 x_sendfile  
  76.     'LOGGER_NAME': None,                 # 日志记录器的名称  
  77.     'LOGGER_HANDLER_POLICY': 'always',  
  78.     'SERVER_NAME': None,                 # 服务访问域名  
  79.     'APPLICATION_ROOT': None,            # 项目的完整路径  
  80.     'SESSION_COOKIE_NAME': 'session',    # cookies中存放session加密字符串的名字  
  81.     'SESSION_COOKIE_DOMAIN': None,       # 在哪个域名下会产生session记录在cookies  
  82.     'SESSION_COOKIE_PATH': None,         # cookies的路径  
  83.     'SESSION_COOKIE_HTTPONLY': True,     # 控制 cookie 是否应被设置 httponly 的标志,  
  84.     'SESSION_COOKIE_SECURE': False,      # 控制 cookie 是否应被设置安全标志  
  85.     'SESSION_REFRESH_EACH_REQUEST': True,  # 这个标志控制永久会话如何刷新  
  86.     'MAX_CONTENT_LENGTH': None,          # 如果设置为字节数, Flask 会拒绝内容长度大于此值的请求进入,并返回一个 413 状态码  
  87.     'SEND_FILE_MAX_AGE_DEFAULT': 12,     # hours 默认缓存控制的最大期限  
  88.     'TRAP_BAD_REQUEST_ERRORS': False,  
  89.     # 如果这个值被设置为 True Flask不会执行 HTTP 异常的错误处理,而是像对待其它异常一样,  
  90.     # 通过异常栈让它冒泡地抛出。这对于需要找出 HTTP 异常源头的可怕调试情形是有用的。  
  91.                 
  92.     'TRAP_HTTP_EXCEPTIONS': False,  
  93.     # Werkzeug 处理请求中的特定数据的内部数据结构会抛出同样也是"错误的请求"异常的特殊的 key errors   
  94.     # 同样地,为了保持一致,许多操作可以显式地抛出 BadRequest 异常。  
  95.     # 因为在调试中,你希望准确地找出异常的原因,这个设置用于在这些情形下调试。  
  96.     # 如果这个值被设置为 True ,你只会得到常规的回溯。  
  97.                 
  98.     'EXPLAIN_TEMPLATE_LOADING': False,  
  99.     'PREFERRED_URL_SCHEME': 'http',       # 生成URL的时候如果没有可用的 URL 模式话将使用这个值  
  100.     'JSON_AS_ASCII': True,  
  101.     # 默认情况下 Flask 使用 ascii 编码来序列化对象。如果这个值被设置为 False   
  102.     # Flask不会将其编码为 ASCII,并且按原样输出,返回它的 unicode 字符串。  
  103.     # 比如 jsonfiy 会自动地采用 utf-8 来编码它然后才进行传输。  
  104.                 
  105.     'JSON_SORT_KEYS': True,  
  106.     #默认情况下 Flask 按照 JSON 对象的键的顺序来序来序列化它。  
  107.     # 这样做是为了确保键的顺序不会受到字典的哈希种子的影响,从而返回的值每次都是一致的,不会造成无用的额外 HTTP 缓存。  
  108.     # 你可以通过修改这个配置的值来覆盖默认的操作。但这是不被推荐的做法因为这个默认的行为可能会给你在性能的代价上带来改善。  
  109.                 
  110.     'JSONIFY_PRETTYPRINT_REGULAR': True,  
  111.     'JSONIFY_MIMETYPE': 'application/json',  
  112.     'TEMPLATES_AUTO_RELOAD': None,  
  113. }  

    通过对象进行配置

  114. # -*- coding: utf-8 -*-  
  115. class FlaskDebug(object):  
  116.     DEBUG = True  
  117.     SECRET_KEY = 'DEBUG_Key_gtgrgtrg'  
  118.     SESSION_COOKIE_NAME = 'debug_session'  
  119.                 
  120.                 
  121. class FlaskTseting(object):  
  122.     TESTING = True  
  123.     SECRET_KEY = 'TESTING_Key_gtgrgtrg'  
  124.     PERMANENT_SESSION_LIFETIME = 15  
  125.     SESSION_COOKIE_NAME = 'TESTING_session'

                 

  126. # -*- coding: utf-8 -*-  
  127. from flask import Flask  
  128. from FlaskSetting import FlaskDebug, FlaskTseting  
  129. app = Flask(__name__)  
  130.                 
  131. 类的方式对象配置  
  132. app.config.from_object(FlaskDebug)  
  133.                 
  134. @app.route('/')  
  135. def index():  
  136.     return 'index'  
  137.                 
  138. app.run(host='0.0.0.0')

                 

    flash闪现

  139. @app.route('/')  
  140. def index():  
  141.     flash('闪现', 'tag')   # tag 闪现命名  
  142.     flash('闪现2', 'tag2')  # tag 闪现命名  
  143.     return 'index'  
  144.                 
  145.                 
  146. @app.route('/index2')  
  147. def index2():  
  148.     # print(get_flashed_messages(category_filter='tag2'))  # flash  
  149.     print(get_flashed_messages(category_filter=['tag','tag2']))  # flash  
  150.     return 'index2' 

                 

    蓝图

    注册蓝图

  151. # -*- coding: utf-8 -*-  
  152. from flask import Flask  
  153. from blue_11 import views  # 导入定义的蓝图视图  
  154. app = Flask(__name__, template_folder="apptmp")  # 指定tmp路径  
  155.                 
  156. app.register_blueprint(views.app, url_prefix='/blue')  # 注册蓝图, url前缀在视图里面和这里写一个即可  
  157.                                                        # 两边都写以注册的为准  
  158.                 
  159. app.run(host='0.0.0.0'debug=True

    蓝图views

  160. # -*- coding: utf-8 -*-  
  161. from flask import Blueprint, render_template  
  162.                 
  163. app = Blueprint('app', __name__,  
  164.                 url_prefix='/blue',)  # url前缀  
  165.                 
  166. @app.route('/')  
  167. def index():  
  168.     return render_template('apptmp.html')  

     Flask 路由,配置,蓝图 Python

             

    CBV

  169. # -*- coding: utf-8 -*-  
  170. from flask import Flask, views  
  171.             
  172. app = Flask(__name__)  
  173.             
  174. 继承  
  175. class Login(views.MethodView):  
  176.     methods = ['GET', 'POST']  # 请求方式  
  177.     decorators = ['', '']  # 存放装饰器  
  178.             
  179.     def get(self):  
  180.         return 'get'  
  181.             
  182.     def post(self):  
  183.         return 'post'  
  184.             
  185.             
  186. app.add_url_rule('/', view_func=Login.as_view('my_login'))  # Login.as_view('my_login') 替换为视图函数  
  187.             
  188.             
  189. app.run(host='0.0.0.0'debug=True)  

           

    面向对象

  190. # -*- coding: utf-8 -*-  
  191. class Foo(object):  
  192.     def __call__(self, *args, **kwargs):  
  193.         print('6666')  
  194.         
  195.     def __setattr__(self, key, value):  
  196.         print(f'添加属性{key}, 值为{value}')  
  197.         
  198.     def __getattr__(self, item):  
  199.         print(f'提取了{item}的值')  
  200.         
  201.         
  202. foo = Foo()  
  203. foo.name = 'peach'  
  204. foo.name  
  205.         
  206. 结果  
  207. 添加属性name, 值为peach  
  208. 提取了name的值  
  209.         
  210. 偏函数  
  211. from functools import partial  
  212.         
  213.         
  214. def ab(a, b):  
  215.     print(a, b)  
  216.     return a + b  
  217.         
  218.         
  219. par_ab = partial(ab, 1)  # 参数传给函数不执行,新函数在执行  
  220. print(par_ab(2))  
  221.         
  222. 结果  
  223. # 1 2  
  224. # 3  

         

    线程安全

  225. 线程安全  
  226. import threading, time  
  227. from threading import local  
  228.         
  229.         
  230. class Foo(local):  
  231.     pass  
  232.         
  233.         
  234. foo = Foo()  
  235.         
  236.         
  237. def add(i):  
  238.     foo.num = i  
  239.     time.sleep(1)  
  240.     # print(线程id.foo.num, threading.current_thread().ident)  
  241.     print(foo.num, threading.current_thread().ident)  
  242.         
  243.         
  244. for i in range(20):  
  245.     th = threading.Thread(target=addargs=(i,))  
  246.     th.start()  
  247.         
  248. """  
  249. 这里是线程用空间换取了时间,  
  250. local 开辟一个字典空间 记录格式  
  251. {  
  252.     线程id f00.num = 0,  
  253.     线程id f00.num = 1,  
  254. }  
  255.         
  256. 线程下次进来后,在字典里面找到自己对应的id  
  257. """  

        

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄