1.Flask URL和视图
1.1.第一个flask程序
from flask import Flask
#创建一个Flask对象,传递__name__参数进去
app = Flask(__name__) #url与视图映射
@app.route('/')
def hello_world():
return 'Hello World!' if __name__ == '__main__':
app.run() #flask中的一个测试应用服务器
浏览器访问:http://127.0.0.1:5000/,也可以更改端口号: app.run(port=5001)
1.2.debug模式
作用:
- 如果抛出异常,在浏览器中可以看到具体错误信息
- 在修改代码后,只要按“ctrl+s”,就会自动重启项目,不用手动重新运行
四种配置方式
第一种
if __name__ == '__main__':
app.run(debug=True)
第二种
app.debug = True
第三种
app.config.update(DEBUG=True)
第四种
新建config.py
DEBUG = Ture
然后在主程序总导入引用
import config app.config.from_object(config)
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()
四种方式
1.3.配置文件
新建config.py
DEBUG =True
主程序中两种引用方式
第一种:
import config app.config.from_object(config)
第二种
app.config.from_pyfile('config.py')
1.4.url传参方式
普通传参方式
@app.route('/p/<id>/')
def article_detail(id):
return '你访问的文章第%s篇'%id

指定参数类型
有以下几种类型:
- string:默认的数据类型
- int:接受整形
- float:浮点型
- path:和string的类似,但是接受斜杠
- any:可以指定多个路径
- uuid:只接受uuid字符串
(1)any
@app.route('/<any(blog,user):url_path>/<id>')
def detail(url_path,id):
if url_path == 'blog':
return '博客详情%s'%id
else:
return '用户详情%s'%id


(2)path
@app.route('/article/<path:test>/')
def test_article(test):
return 'test_article:{}'.format(test)

获取参数
from flask import Flask,request
@app.route('/tieba/')
def tieba():
wd = request.args.get('wd')
return '获取的参数的是%s'%wd

1.5.url_for的使用
(1)通过视图函数解析出url
from flask import Flask,url_for
@app.route('/')
def hello_world():
return url_for('my_list',page=2) #url_for里面:第一个是视图函数,第二个是url需要的参数
@app.route('/list/<page>/')
def my_list(page):
return 'my_list'

(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'

1.6.Response
视图函数中可以返回的类型
- 可以返回字符串,返回的字符串其实底层将这个字符串包装成了一个‘Response’对象
- 可以返回元组,形式(响应体,状态码,头部信息),返回的元组其实底层将这个字符串包装成了一个‘Response’对象
- 可以返回Response及其子类
实现一个自定义的Response对象
- 继承自、‘Response’类
- 实现方法‘force_type’
- 指定‘app.response_class’为你自定义的‘Response’对象
- 如果视图函数返回的数据,不是字符串,也不是元组,也不是Response对象,那么就会将返回值传给‘force_type’,然后将‘force_type’的返回值返回给前端
实例:
from flask import Flask,url_for,Response,jsonify
app = Flask(__name__)
class JsonResponse(Response):
@classmethod
def force_type(cls, response, environ=None):
'''
这个方法只有视图函数返回非字符、非元祖、非Response对象才会调用
:param response:
:param environ:
:return:
'''
#把字典转换成json
if 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)
因为/list3/返回的是字典类型,非字符、非元祖、非Response对象,所以执行force_type方法

1.7.add_url_rule
主程序
from flask import Flask,render_template,url_for app = 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()

1.8.类视图
之前使用的视图都是函数,简称为视图函数,视图也可以基于类来实现,类视图的好处是支持继承,类视图需要通过app.add_url_role(url_rule,view_func)来进行注册,类里面要加装饰器就用:detactors=[] ,里面可以添加多个装饰器
(1)标准视图
- 继承views.VIew
- 必须实现‘dispatch_request’方法,以后请求过来后,都会执行这个方法,返回值相当于视图函数一样,必须返回'Response'或者子类的对象,或者是字符串,或者是元祖
- 必须通过app.add_url_role(url_rule,view_func)来做url与视图的映射
实例
from flask import Flask,url_for,views 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')) @app.route('/')
def hello_world():
return 'Hello World!' with app.test_request_context():
print(url_for('list')) #/list/ if __name__ == '__main__':
app.run()

(2)通过类的继承实现多个视图返回json数据
from flask import Flask,url_for,views,jsonify app = Flask(__name__)
app.config.update({
'DEBUG':True,
'TEMPLATES_AUTO_RELOAD':True
}) #父类,把数据转换成json格式
class JsonView(views.View):
def get_data(self):
raise NotImplementedError def 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()

(3)基于调度方法的类视图
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'))
1.Flask URL和视图的更多相关文章
- flask之URL和视图(一)
1.Flask URL和视图 1.1.第一个flask程序 from flask import Flask #创建一个Flask对象,传递__name__参数进去 app = Flask(__name ...
- 【Python】Flask系列-URL和视图笔记
1.学习目标 熟悉Flask相关知识. 熟悉web开发流程. 能独立开发Flask项目. 2.环境配置 Python虚拟环境安装 因为python的框架更新迭代太快了,有时候需要在电脑上存在一个框架的 ...
- flask第七篇——URL与视图函数的映射
有兴趣的朋友可以添加微信公众号:自动化测试实战 今天开始就要进入正题了.大家都准备好了吧~ 代码提示 先和大家说个小知识点:有同学后台说输入flask代码pycharm不提示,现在告诉你一个解决方法: ...
- Flask学习 url和视图
因为扫描器的准备使用Flask框架,所以开始恶补Flask和前后端的知识 Flask是一个使用Python编写的轻量级Web应用框架,作者是 Armin Ronacher(他也是 Werkzeug 及 ...
- Flask即插视图与tornado比较
由于公司使用了Tornado框架和Flask框架,之前一直使用的都是Flask框架,已经对url下面紧跟着视图的写法很固执.刚开始接触Tornado框架,对于其url和视图分开的写法思想上无法转变.今 ...
- Python框架学习之Flask中的视图及路由
在前面一讲中我们学习如何创建一个简单的Flask项目,并做了一些简单的分析.接下来在这一节中就主要来讲讲Flask中最核心的内容之一:Werkzeug工具箱.Werkzeug是一个遵循WSGI协议的P ...
- Python学习笔记整理总结【Django】【MVC/MTV/路由分配系统(URL)/视图函数 (views)/表单交互】
一.Web框架概述 Web框架本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env python # -*- coding:utf-8 ...
- Flask基础(06)-->视图常用逻辑
Flask基础(06)-->视图常用逻辑 返回json 重定向:url_for 自定义状态码 返回json:在使用 Flask 写一个接口时候需要给客户端返回 JSON 数据,在 Flask 中 ...
- python flask url参数
python flask url参数 常见 url 传参中都是 xxx?xxx=xxx 问题来了 flask中我没有找到 关于xx? 问号的使用方式 是不是flask就不支持这种方式 如果有 rout ...
随机推荐
- Volley 图片加载相关源码解析
转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/47721631: 本文出自:[张鸿洋的博客] 一 概述 最近在完善图片加载方面的 ...
- 学习Javascript数据结构与算法(第2版)笔记(1)
第 1 章 JavaScript简介 使用 Node.js 搭建 Web 服务器 npm install http-server -g http-server JavaScript 的类型有数字.字符 ...
- Executor框架简介
Executor框架是在Java5中引入的,可以通过该框架来控制线程的启动,执行,关闭,简化并发编程.Executor框架把任务提交和执行解耦,要执行任务的人只需要把任务描述清楚提交即可,任务的执行提 ...
- hibernate MTM 联合主键
//适用于表里没有其他列,只有主键 //Course.java实体类 package com.tao.pojo; import java.util.HashSet; import java.util. ...
- cogs 2235 烤鸡翅
贪心,每次如果够直接卖,不够找到之前的卖出的最多的一份,然后反悔 不过反悔的确是很好的策略! #include<cstdio> #include<cstring> #inclu ...
- bzoj3289 Mato的文件管理 莫队+树状数组
求逆序对个数,莫队套树状数组 #include<cstdio> #include<iostream> #include<cstring> #include<c ...
- jquery 判断一个元素是否在数组中 $.inarry()使用
需要判断一个元素是否在一个数组里: js indexOf()方法 如果存在 则返回该元素的下标值 如果不存在则返回-1 学习源头: http://www.w3school.com.cn/jsref/ ...
- 我和Python的Py交易》》》》》》数据类型
Python里的变量 ---门牌 Python在使用变量之前无须定义它的类型,但是必须声明以及初始化该变量. Python中给变量赋值就是声明,初始化变量(也就是创建一个相应数据类型的对象,而那些数据 ...
- CSS 盒模型与box-sizing
一.盒模型 一个web页面由许多html元素组成,而每一个html元素都可以表示为一个矩形的盒子,CSS盒模型正是描述这些矩形盒子的存在. MDN的描述: When laying out a docu ...
- MATLAB——画图(经典)
今天我发现一个非常奇怪的事情,如果你喜欢一样东西或者说是要干一件事,并不一定要把它所在领域的所有都做好, 只要做好你喜欢的就可以了,正如现在的我,突然想学习MATLAB(想画图)那么你只要把一些基础的 ...