flask配置文件

flask路由系统

@app.route() 装饰器中的参数

如果不明白装饰器 点击这里

methods : 当前 url 地址,允许访问的请求方式
  1. @app.route("/info", methods=["GET", "POST"])
  2. def student_info():
  3. stu_id = int(request.args["id"])
  4. return f"Hello Old boy {stu_id}" # Python3.6的新特性 f"{变量名}"
endpoint : 反向url地址,默认为视图函数名 (url_for)
  1. from flask import url_for
  2. @app.route("/info", methods=["GET", "POST"], endpoint="r_info")
  3. def student_info():
  4. print(url_for("r_info")) # /info
  5. stu_id = int(request.args["id"])
  6. return f"Hello Old boy {stu_id}" # Python3.6的新特性 f"{变量名}"
defaults : 视图函数的参数默认值{"nid":1}
  1. from flask import url_for
  2. @app.route("/info", methods=["GET", "POST"], endpoint="r_info", defaults={"nid": 100})
  3. def student_info(nid):
  4. print(url_for("r_info")) # /info
  5. # stu_id = int(request.args["id"])
  6. print(nid) # 100
  7. return f"Hello Old boy {nid}" # Python3.6的新特性 f"{变量名}"
strict_slashes : url地址结尾符"/"的控制 False : 无论结尾 "/" 是否存在均可以访问 , True : 结尾必须不能是 "/"
  1. # 访问地址 : /info
  2. @app.route("/info", strict_slashes=True)
  3. def student_info():
  4. return "Hello Old boy info"
  5. # 访问地址 : /infos or /infos/
  6. @app.route("/infos", strict_slashes=False)
  7. def student_infos():
  8. return "Hello Old boy infos"
redirect_to : url地址重定向
  1. # 访问地址 : /info 浏览器跳转至 /infos
  2. @app.route("/info", strict_slashes=True, redirect_to="/infos")
  3. def student_info():
  4. return "Hello Old boy info"
  5. @app.route("/infos", strict_slashes=False)
  6. def student_infos():
  7. return "Hello Old boy infos"
subdomain : 子域名前缀 subdomian="DragonFire" 这样写可以得到 DragonFire.oldboyedu.com 前提是app.config["SERVER_NAME"] = "oldboyedu.com"
  1. app.config["SERVER_NAME"] = "oldboy.com"
  2. @app.route("/info",subdomain="DragonFire")
  3. def student_info():
  4. return "Hello Old boy info"
  5. # 访问地址为: DragonFire.oldboy.com/info

关于路由目前就说这么多,之后的课程中会有关于Flask路由系统的源码剖析,再详细说明Flask路由系统的工作原理

动态参数路由:

  1. from flask import url_for
  2. # 访问地址 : http://127.0.0.1:5000/info/1
  3. @app.route("/info/<int:nid>", methods=["GET", "POST"], endpoint="r_info")
  4. def student_info(nid):
  5. print(url_for("r_info",nid=2)) # /info/2
  6. return f"Hello Old boy {nid}" # Python3.6的新特性 f"{变量名}"

int:nid 就是在url后定义一个参数接收

但是这种动态参数路由,在url_for的时候,一定要将动态参数名+参数值添加进去,否则会抛出参数错误的异常

路由正则:

一般不用,如果有特殊需求,不怕麻烦的话,这个东西还是挺好用的,前提是你的正则玩儿的很6

注意事项以及源码示例:

  • flask的路由系统比较特殊,是通过装饰器实现的,但是究其本质,还是通过 app.add_url_rute 方法来实现的。
  1. from flask import Flask, request, current_app
  2. import importlib
  3. app = Flask(__name__)
  4. # 导入配置文件
  5. app.config.from_object('settings.DevConfig')
  6. # flask路由系统
  7. @app.route('/')
  8. def hello_world():
  9. return 'Hello World!'

路由源码以及其分析

  1. # 以 @app.route('/index', endpoint='index', methods=['GET']) 为例
  2. # 函数本质是是个闭包函数
  3. def route(self, rule, **options):
  4. # self 表示的app对象的实例
  5. # rule 表示路由 rule='/index'
  6. # **options 是其他参数 这里 endpoint='index', methods=['GET']
  7. def decorator(f):
  8. # 这里是获取 endpoint的值,如果不存在则为None
  9. endpoint = options.pop("endpoint", None)
  10. # 本质上是 执行 app.add_url_rule('/index',....)
  11. self.add_url_rule(rule, endpoint, f, **options)
  12. return f
  13. return decorator
  14. """
  15. 第一步 执行route 后返回 decorator
  16. 第二步 执行@decorator -->decorator(index)
  17. """
  18. @app.route('/index', endpoint='index', methods=['GET'])
  19. # 参数endpoint不写 默认为函数名,用户反向生成url
  20. def index():
  21. print(current_app.config['DB'])
  22. return "xxx"
  23. def login():
  24. return 'login'
  25. # 这是另外一种路由方式,类似于django中的path('',views.....)
  26. app.add_url_rule('/login', 'n2',login,methods=['GET', 'POST'])
  27. if __name__ == '__main__':
  28. app.run()
  1. def _endpoint_from_view_func(view_func):
  2. """
  3. Internal helper that returns the default endpoint for a given
  4. function. This always is the function name.
  5. """
  6. assert view_func is not None, "expected view func if endpoint is not provided."
  7. # 如果 endpoint=None的时候,返回的是 默认的endpoint view_func的名字
  8. return view_func.__name__

CBV简单实现

  1. from flask import Flask, request, current_app,views
  2. import importlib
  3. app = Flask(__name__)
  4. app.config.from_object('settings.DevConfig')
  5. # 装饰器
  6. def auth(func):
  7. def inner(*args,**kwargs):
  8. result = func(*args,**kwargs)
  9. return result
  10. return inner
  11. class IndexView(views.MethodView):
  12. methods = ['GET','POST']
  13. decorators =[auth,]
  14. def get(self):
  15. return 'index.get'
  16. def post(self):
  17. return 'index.post'
  18. app.add_url_rule('/index',view_func=IndexView.as_view(name='index')) # name=endpoint
  19. if __name__ == '__main__':
  20. app.run()

源码分析

  1. class MethodView(with_metaclass(MethodViewType, View)):
  2. """A class-based view that dispatches request methods to the corresponding
  3. class methods. For example, if you implement a ``get`` method, it will be
  4. used to handle ``GET`` requests. ::
  5. class CounterAPI(MethodView):
  6. def get(self):
  7. return session.get('counter', 0)
  8. def post(self):
  9. session['counter'] = session.get('counter', 0) + 1
  10. return 'OK'
  11. app.add_url_rule('/counter', view_func=CounterAPI.as_view('counter'))
  12. """
  13. # 类似于django中的dispatch,视图类中分发不同请求说对应的方法
  14. def dispatch_request(self, *args, **kwargs):
  15. meth = getattr(self, request.method.lower(), None)
  16. # If the request method is HEAD and we don't have a handler for it
  17. # retry with GET.
  18. if meth is None and request.method == "HEAD":
  19. meth = getattr(self, "get", None)
  20. assert meth is not None, "Unimplemented method %r" % request.method
  21. return meth(*args, **kwargs)
  22. # 如果是get请求,返回的是 get(*args,**kwargs)

host文件路径(修改本地DNS对应关系)

  • windows:C:\Windows\System32\drivers\etc\hosts

  • mac:/etc/hosts

flask那些事(一)的更多相关文章

  1. 一般人不知道的Flask框架SQLAlchemy的那些事

    目录 SQLAlchemy 1.介绍 2.简单使用(能创建表,删除表,不能修改表) 3.一对多关系 4.多对多关系 5.操作数据表 6.基于scoped_session实现线程安全 7.基本增删查改 ...

  2. Flask —— 使用Python和OpenShift进行即时Web开发

    最近Packtpub找到了我,让我给他们新出版的关于Flask的书写书评.Flask是一个很流行的Python框架.那本书是Ron DuPlain写的<Flask 即时Web开发>.我决定 ...

  3. 写给新手看的Flask+uwsgi+Nginx+Ubuntu部署教程

    学习 Flask,写完一个 Flask 应用需要部署的时候,就想着折腾自己的服务器.根据搜索的教程照做,对于原理一知半解,磕磕碰碰,只要运行起来了,谢天谢地然后不再折腾了,到下一次还需要部署时,这样的 ...

  4. flask开发restful api系列(1)

    在此之前,向大家说明的是,我们整个框架用的是flask + sqlalchemy + redis.如果没有开发过web,还是先去学习一下,这边只是介绍如果从开发web转换到开发移动端.如果flask还 ...

  5. Flask中endpoint的理解

    在flask框架中,我们经常会遇到endpoint这个东西,最开始也没法理解这个到底是做什么的.最近正好在研究Flask的源码,也就顺带了解了一下这个endpoint 首先,我们看一个例子: @app ...

  6. flask tutorial => make a blog :) flask 搭建博客系统从零开始!

    please follow the tutorial from the official site :) http://flask.pocoo.org/docs/ You could download ...

  7. 关于flask线程安全的简单研究

    flask是python web开发比较主流的框架之一,也是我在工作中使用的主要开发框架.一直对其是如何保证线程安全的问题比较好奇,所以简单的探究了一番,由于只是简单查看了源码,并未深入细致研究,因此 ...

  8. flask + Python3 实现的的API自动化测试平台---- IAPTest接口测试平台(总结感悟篇)

    前言: 在前进中去发现自己的不足,在学习中去丰富自己的能力,在放弃时想想自己最初的目的,在困难面前想想怎么踏过去.在不断成长中去磨炼自己. 正文: 时间轴 flask + Python3 实现的的AP ...

  9. 【Flask】 网站的用户管理

    网站用户管理 不知道为什么很多学习Flask的人都是从搭博客开始的(大概是因为那本书的案例是博客,同时对bootstrap支持良好,bootstrap又是twitter开发的吧..)既然是搭建博客,就 ...

随机推荐

  1. svn 在Windows下用TortoiseSVN checkout 时报认证错误

    TortoiseSVN 第一次 checkout(检出)时,需要输入用户名密码,如果第一次你保存了你的用户名密码,那么这个检出的项目以后就会用这个用户名密码,如果你的密码改了之后,就会报一个认证错误的 ...

  2. 七、数据提取之JSON与JsonPATH

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写.同时也方便了机器进行解析和生成.适用于进行数据交互的场景,比如网站前台与 ...

  3. 系统设计与分析:Alpha版本2成绩汇总

    作业要求 1.作业内容 作业具体要求以及评分标准 2.评分细则 •给出开头和团队成员列表(10’) •给出发布地址以及安装手册(20’) •给出测试报告(40’) •给出项目情况总结(30’)   * ...

  4. nginx目录详解

  5. PageHelper分页(十)

    分页有两种: (1) 物理分页:物理分页依赖的是某一物理实体,这个物理实体就是数据库,比如MySQL数据库提供了limit关键字,程序员只需要编写带有limit关键字的SQL语句,数据库返回的就是分页 ...

  6. vue中的router和route有什么区别?

    我只知道前者一般用在跳转路由的时候,push一个url, 而后者则用来存储路由跳转过程中存储的各种数据. 话不多说,这篇博客讲的比较详细,可以参考一下. vue2.0中的$router 和 $rout ...

  7. 浅谈C++ STL vector 容器

    浅谈C++ STL vector 容器 本篇随笔简单介绍一下\(C++STL\)中\(vector\)容器的使用方法和常见的使用技巧.\(vector\)容器是\(C++STL\)的一种比较基本的容器 ...

  8. Python 协程 (Coroutine)

    协程 (Coroutine) 什么是协程 协程(微线程)是比线程更轻量化的存在,像一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程 最重要的是,协程不是被操作系统内核所管理,而完全是由程序所控 ...

  9. appium--python启动appium服务

    前戏 前面我们都是在cmd下通过输入appium加端口号来启动服务的,在我们做自动化的时候,我们当然不希望我们手动启动appium服务,而是希望通过脚本自动启动appium服务. 我们可以使用subp ...

  10. Educational Codeforces Round 63 (Rated for Div. 2) D dp(最大连续子序列)

    https://codeforces.com/contest/1155/problem/D 题意 一个n个数的数组\(a[i]\),可以选择连续的一段乘x,求最大连续子序列的值 题解 错误思路:贪心, ...