flask(一)之路由和视图
01-介绍
Flask 是一个 Python 实现的 Web 开发微框架,同时具有很强的扩展能力。
02-第一个flask程序
# 初始化from flask import Flask, url_for, views app = Flask(__name__)
Flask类的构造函数只有一个必须指定的参数,即应用主模块或包的名称。在大多数应用中,Python的__name__变量就是所需的值。
from flask import Flask# 创建flask对象,传递__name__参数进去 app = Flask(__name__)# url与视图映射 @app.route('/') def hello_world():return 'Hello World!'if __name__ == '__main__':app.run() # 也可以更改端口号 run(port=5500)
03-设置debug模式
from flask import Flask import config #创建一个Flask对象,传递__name__参数进去 app = Flask(__name__) # app.debug = True #第二种 # app.config.update(DEBUG=True) #第三种 app.config.from_object(config) #第四种#url与视图映射 @app.route('/') def hello_world():print('helloworkl')return 'Hello World!'if __name__ == '__main__':# app.run(debug=True) #第一种app.run()
04-配置文件
新建config.py
DEBUG =True
主程序中的两种引用方式:
# 第一种:推荐使用 import config app.config.from_object(config) # 第二种: app.config.from_pyfile('config.py')
05-url传参方式
from flask import Flask, request# 创建flask对象,传递__name__参数进去 app = Flask(__name__)# 普通的传参方式 127.0.0.1:5000/p/1 @app.route('/p/<id>/') def article_detail(id):return '你访问的文章第%s篇' % id""" 指定参数类型 有以下几种类型:string:默认的数据类型int:接受整形float:浮点型path:和string的类似,但是接受斜杠any:可以指定多个路径uuid:只接受uuid字符串 """# any: 127.0.0.1:5000/blog/id 127.0.0.1:5000/user/id @app.route('/<any(blog,user):url_path>/<id>') def detail(url_path, id):if url_path == 'blog':return '博客详情%s' % idelse:return '用户详情%s' % id# path: 127.0.0.1:5000/article/python/1/ @app.route('/article/<path:test>/') def test_article(test):return 'test_article:{}'.format(test)# 获取参数 127.0.0.1:5000/tieba/?wd=python @app.route('/tieba/') def tieba():wd = request.args.get('wd')return '获取的参数的是%s' % wdif __name__ == '__main__':app.run()
06-url_for:实现创建url,只是生成一个url
如果要生成一个css样式的静态文件的url需要使用url_for('static',filename='style.css')来创建相应的url。
视图中的url_for:
# 1. 通过视图函数解析出urlfrom flask import Flask, url_for@app.route('/') def hello_world():# url_for里面:第一个是视图函数,第二个是url需要的参数return url_for('my_list',page=2) @app.route('/list/<page>/') def my_list(page):return 'my_list'访问 127.0.0.1:5000/,结果:/list/2/# 2. url_for里面多的参数会当做搜索字符 @app.route('/') def hello_world():return url_for('my_list',page=2,count=2) @app.route('/list/<page>/') def my_list(page):return 'my_list'访问 127.0.0.1:5000/,结果:/list/2/?count=2
模板中的url_for:
模板中的url_for
和视图函数中的url_for
是类似的,也是传递视图函数的名字,也可以传递参数。使用的时候,需要在url_for
两边加上一个{{ url_for('func_name'),ref='/',id='1'}}
07-Response
视图函数中可以返回的类型:1. 可以返回字符串,返回的字符串其实底层将这个字符串包装成了一个‘Response’对象2. 可以返回元组,形式(响应体,状态码,头部信息),返回的元组其实底层将这个字符串包装成了一个‘Response’对象3. 可以返回Response及其子类实现一个自定义的Response对象:1.继承自、‘Response’类2. 实现方法‘force_type’3. 指定‘app.response_class’为你自定义的‘Response’对象4. 如果视图函数返回的数据,不是字符串,也不是元组,也不是Response对象,那么就会将返回值传给‘force_type’,然后将‘force_type’的返回值返回给前端
from flask import Flask,url_for,Response,jsonifyapp = Flask(__name__)class JsonResponse(Response):@classmethoddef force_type(cls, response, environ=None):'''这个方法只有视图函数返回非字符、非元祖、非Response对象才会调用:param response::param environ::return:'''# 把字典转换成jsonif isinstance(response,dict):# jsonify将字典转换成json对象,还将该对象包装成了一个Response对象response = jsonify(response)return super(JsonResponse, cls).force_type(response,environ)app.response_class = JsonResponse@app.route('/') def hello_world():return 'Hello world'@app.route('/list1/') def list1():return Response('list1') # 合法对象,直接返回 @app.route('/list3/') def list3():return {'username':'derek','age':18} # 返回的是非字符、非元祖、非Response对象,所以执行force_type方法if __name__ == '__main__':app.run(debug=True)
08-add_url_rule:
from flask import Flask, render_template, url_forapp = Flask(__name__) app.config.update({'DEBUG':True, # 配置自动加载模板文件,调试模式下会自动开启'TEMPLATES_AUTO_RELOAD':True })@app.route('/',endpoint='index') def hello_world():print(url_for("derek_list")) # 通过endpoint找到对应的url /list/return render_template('index.html')def my_list():return "列表页"# 三个参数 # 1.url # 2.给url起个别名,如果没有指定endpoint,则默认使用视图函数的名字作为endpoint的值 # 3.视图函数 app.add_url_rule('/list/',endpoint='derek_list',view_func=my_list)with app.test_request_context():print(url_for('index')) # /if __name__ == '__main__':app.run()
09-render_template: 渲染模板文件
from flask import Flask, render_template, url_forreturn render_template('index.html')
10-send_from_directory:主要用于下载文件
from flask import Flask from flask import g from flask import send_from_directory from flask import url_for import os.pathapp = Flask(__name__) dirpath = os.path.join(app.root_path,'upload') @app.route("/download/<path:filename>") def downloader(filename):return send_from_directory(dirpath,filename,as_attachment=True)
11-static_url_path和static_folder
static_url_path主要用于改变url的path的,静态文件放在static下面,所以正常情况url是static/filename ,但是可以通过static_url_path来改变这个url。
static_folder主要是用来改变url的目录的,默认是static,可以通过这个变量来改变静态文件目录。
from flask import Flask from flask import g from flask import send_from_directory from flask import url_for import os.pathapp = Flask(__name__,static_url_path="/test")@app.route("/") def static_create():return url_for('static',filename='style.css')
12-Request对象
Request是Flask中表示当前请求的request对象,一般称之为请求上下文变量(可以理解成全局变量,在任意一个视图中都可以访问到)。常用的属性有:args:url中的查询字符串。本质上是键值对,跟在"?"后面,多个键值对之间使用"&"连接;form:请求url中的表单数据。也是由键值对组成,一般使用post方法提交数据cookies:请求中的cookie信息。由服务器生成的键值对,把值发送给客户端并保存,稍后重点讲解!files:上传的文件
12-类视图
1. 继承views.VIew。 2. 必须实现‘dispatch_request’方法,以后请求过来后,都会执行这个方法,返回值相当于视图函数一样,必须返回'Response'或者子类的对象,或者是字符串,或者是元祖。 3. 必须通过app.add_url_role(url_rule,view_func)来做url与视图的映射。
from flask import Flask, url_for, views # 创建一个Flask对象,传递__name__参数进去 app = Flask(__name__)app.config.update({'DEBUG': True,'TEMPLATES_AUTO_RELOAD': True, })class ListView(views.View):def dispatch_request(self):return "我的列表页"# 1.ListView.as_view('list')里面必须传个参数‘name’,给view_func起个别名,实际上就是dispatch_request函数 # 2.endpoint也可以不指定,则默认使用view_func的别名(name参数的值) app.add_url_rule('/list/', endpoint='list', view_func=ListView.as_view('list'))# url与视图映射 @app.route('/') def hello_world():return 'Hello World!'if __name__ == '__main__':app.run(port=5555)
13-通过类的继承实现多个视图返回json数据
from flask import Flask,url_for,views,jsonifyapp = Flask(__name__) app.config.update({'DEBUG':True,'TEMPLATES_AUTO_RELOAD':True })# 父类,把数据转换成json格式 class JsonView(views.View):def get_data(self):raise NotImplementedErrordef dispatch_request(self):return jsonify(self.get_data())# 子类只需要写get_data方法 class ListView(JsonView):def get_data(self):return {"usernmae":'derek','age':18}app.add_url_rule('/list/',endpoint='list',view_func=ListView.as_view('list'))@app.route('/') def hello_world():return 'Hello World!'if __name__ == '__main__':app.run()
14-基于调度方法的类视图
class LoginView(views.MethodView):def __render(self,error=None):return render_template('login.html', error=error)def get(self,error=None):return self.__render()def post(self):username = request.form.get('username')password = request.form.get('password')if username == 'derek' and password == '123':return '登录成功'else:return self.__render(error='用户名或密码错误')app.add_url_rule('/login/',view_func=LoginView.as_view('login'))
15-路由
方式一:
在Flask应用中定义路由的最简单方式,是使用应用实例提供的 app.route 装饰器。
# url与视图映射 @app.route('/') def hello_world():return 'Hello World!'
方式二:
使用 add_url_rule()方法。接收3个参数:URL,端点名和视图函数。
16-Web开发服务器
Flask应用自带Web服务器,通过 flask run 命令启动。这个命令在 FLASK_APP 环境变量指定的python脚本中寻找应用的实例。
$ export FLASK_APP=hello.py$ flask run
17-请求-响应循环
17.1 应用和请求上下文
为了避免大量可有可无的参数把视图函数弄得很乱,Flask使用 上下文 临时把一些变量变为全局可以访问。
在Flask中有两种上下文:应用上下文和请求上下文。
注意:获取应用上下文的方法是应用实例上调用 app.app_context()。
17.2 请求分派
17.3 请求对象
Falsk通过上下文变量request对外开放请求对象,包含了客户端发送的HTTP请求的全部信息。
Flask请求中最常用的属性和方法:
17.4 请求钩子
转载于:https://www.cnblogs.com/pgxpython/p/10381905.html
flask(一)之路由和视图相关推荐
- python flask 路由_python框架之Flask(2)-路由和视图Session
路由和视图 这一波主要是通过看源码加深对 Flask 中路由和视图的了解,可以先回顾一下装饰器的知识:[装饰器函数与进阶] 路由设置的两种方式 #示例代码 from flask importFlask ...
- Flask框架(1.flask概述,Windows配置 virtualenv虚拟环境步骤和路由以及视图函数的定义)
框架: 软件框架,指的是为了实现某个业界标准或者完成特别基本任务的软件组件规范,也指为了实现某个软件组建规范时,提供规范所要求之基础功能的软件产品. 框架的功能类似于基础设施,提 ...
- Flask框架——路由和视图
目录 创建一个简单flask框架程序 路由视图函数 参数加载方式 创建一个简单flask框架程序 #1.导入Flask类 from flask import Flask#2.创建Flask对象接收一个 ...
- flask -- 路由与视图函数
原文链接 1. 概述 路由 是MVC架构的Web框架中相当重要的一个概念,也是本节课程的重点.顾名思意,路由就是在迷茫中找出一条路的意思.在Flask框架中,路由 就表示为用户请求的URL找出其对应的 ...
- Python Flask 中的路由
Python Flask 中的路由 在 Web 应用中,接口一般都是遵守 RESTful API 设计风格的,这种风格很优雅,而且对用户来说非常易于理解. RESTful API 参考:https:/ ...
- Django路由与视图
路由层 一.路由匹配规则: 第一个参数是正则表达式,匹配规则按照从上往下一次匹配,匹配到一个之后立即匹配,直接执行对应的视图函数 url(r'login', views.login), 如果按上面的形 ...
- flask v0.1 路由
路由,就是将URL和Function对应起来, 可以将URL作为key,将Function作为value.但是flask中并不是这么简单. flask中构建路由有两种方法: 1.app.add_url ...
- 微课商城系统开发: 配置路由与视图;商品首页后端数据渲染;
配置路由与视图 两个app里面分别创建urls文件,然后在主url文件中配置路径. 第一行是商城的主页:第二行是课程的详细页,里面要传入课程的id:第三行是课程视频播放页,传入课程id:第四行是视频流 ...
- Flask学习之旅——3 视图高级
Flask学习之旅--3 视图高级 前言 本文为<知了传课-- 视图高级>的学习笔记. 蓝图 为什么使用蓝图? 当项目比较大或者代码比较多的时候,让所有的url和视图函数放在同一个文件夹里 ...
最新文章
- PE知识复习之PE的导出表
- node.js webpack html-webpack-plugin
- pycharm不认识numpy?_深度学习(CV方向)入坑不完全指南
- 2015.03.20使命
- MATLAB程序(入门)
- 编写树莓派引脚驱动代码
- html纯白色代码,想用纯白的背景代码。
- 无盘服务器chkdsk *: /f)修复命令,使用CHKDSK命令修复U盘文件或目录损坏无法读取问题...
- 使用SVM/k-NN模型实现手写数字多分类 - 清华大学《机器学习实践与应用》22春-周作业
- 【面试篇】牛客网面试总结
- 关于数据表设计的问题, 是主键 id 作为关联, 还是其他的唯一字段?
- 基于微信小程序的奶茶点单系统设计与实现-计算机毕业设计源码+LW文档
- 9.13 用C语言实现LED1/LED2/LED3灯点亮
- 哪种视频不能用于投放DOU+,DOU+投放的视频有要求限制吗?
- Xilinx官方DDR3调试总结
- CSS—新增标签标签
- go测试框架Convey + Monkey的使用
- Fragment全解析系列(一):那些年踩过的坑
- 在职人士,围绕工作开展学习更实在
- 微信小程序-音频播放 每次都是重复播放同一条录音