Flask_URL和视图
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. @app.route() 装饰器中的参数
methods : 当前 url 地址,允许访问的请求方式
@app.route("/info", methods=["GET", "POST"])
def student_info():
stu_id = int(request.args["id"])
return f"Hello {stu_id}" # Python3.6的新特性 f"{变量名}"
endpoint : 反向url地址,默认为视图函数名 (url_for)
from flask import url_for
@app.route("/info", methods=["GET", "POST"], endpoint="r_info")
def student_info():
print(url_for("r_info")) # /info
stu_id = int(request.args["id"])
return f"Hello {stu_id}" # Python3.6的新特性 f"{变量名}"
defaults : 视图函数的参数默认值{"nid":1}
from flask import url_for
@app.route("/info", methods=["GET", "POST"], endpoint="r_info", defaults={"nid": 100})
def student_info(nid):
print(url_for("r_info")) # /info
# stu_id = int(request.args["id"])
print(nid) # 100
return f"Hello Old boy {nid}" # Python3.6的新特性 f"{变量名}"
strict_slashes : url地址结尾符"/"的控制 False : 无论结尾 "/" 是否存在均可以访问 , True : 结尾必须不能是 "/"
# 访问地址 : /info
@app.route("/info", strict_slashes=True)
def student_info():
return "Hello info" # 访问地址 : /infos or /infos/
@app.route("/infos", strict_slashes=False)
def student_infos():
return "Hello infos"
redirect_to : url地址重定向
# 访问地址 : /info 浏览器跳转至 /infos
@app.route("/info", strict_slashes=True, redirect_to="/infos")
def student_info():
return "Hello info" @app.route("/infos", strict_slashes=False)
def student_infos():
return "Hello infos"
subdomain : 子域名前缀 subdomian="ward" 这样写可以得到 ward.xxx.com 前提是app.config["SERVER_NAME"] = "xxx.com"
app.config["SERVER_NAME"] = "xxx.com"
@app.route("/info",subdomain="ward")
def student_info():
return "Hello info"
# 访问地址为: ward.xxx.com/info
关于路由目前就说这么多,之后的课程中会有关于Flask路由系统的源码剖析,再详细说明Flask路由系统的工作原理
2.动态参数路由:
from flask import url_for # 访问地址 : http://127.0.0.1:5000/info/1
@app.route("/info/<int:nid>", methods=["GET", "POST"], endpoint="r_info")
def student_info(nid):
print(url_for("r_info",nid=2)) # /info/2
return f"Hello {nid}" # Python3.6的新特性 f"{变量名}"
<int:nid> 就是在url后定义一个参数接收
但是这种动态参数路由,在url_for的时候,一定要将动态参数名+参数值添加进去,否则会抛出参数错误的异常
3.路由正则:
一般不用,如果有特殊需求,不怕麻烦的话,这个东西还是挺好用的.
Flask_URL和视图的更多相关文章
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库
在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...
- ASP.NET Core 中文文档 第四章 MVC(3.8)视图中的依赖注入
原文:Dependency injection into views 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:孟帅洋(书缘) ASP.NET Core 支持在视图中使用 依赖 ...
- 在WPF中使用依赖注入的方式创建视图
在WPF中使用依赖注入的方式创建视图 0x00 问题的产生 互联网时代桌面开发真是越来越少了,很多应用都转到了浏览器端和移动智能终端,相应的软件开发上的新技术应用到桌面开发的文章也很少.我之前主要做W ...
- ABP文档 - Mvc 视图
文档目录 本节内容: 简介 AbpWebViewPage 基类 简介 ABP通过nuget包Abp.Web.Mvc集成到Mvc视图里,你可以像往常那样创建常规的视图. AbpWebViewPage 基 ...
- 探索ASP.NET MVC5系列之~~~2.视图篇(上)---包含XSS防御和异步分部视图的处理
其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...
- 探索ASP.NET MVC5系列之~~~3.视图篇(下)---包含常用表单和暴力解猜防御
其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...
- SQL Server-聚焦在视图和UDF中使用SCHEMABINDING(二十六)
前言 上一节我们讨论了视图中的一些限制以及建议等,这节我们讲讲关于在UDF和视图中使用SCHEMABINDING的问题,简短的内容,深入的理解,Always to review the basics. ...
- SQL Server-聚焦使用视图若干限制/建议、视图查询性能问题,你懵逼了?(二十五)
前言 上一节我们简单讲述了表表达式的4种类型,这一系列我们来讲讲使用视图的限制,简短的内容,深入的理解,Always to review the basics. 避免在视图中使用ORDER BY 上一 ...
- MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...
随机推荐
- 关于iscroll.js插件的使用
iscroll 作用: 可以让区域滚动效果好看一些 使用: 1. html结构 外面必须包一层盒子,切内部的元素要尽量简单,不然会影响滚动效果 <div id="wrapper&quo ...
- parseint和isNaN用法
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- Android WindowManager和WindowManager.LayoutParams的使用以及实现悬浮窗口的方法
1.理清概念 我们使用过Dialog和PopupWindow,还有Toast,它们都显示在Activity之上.那么我们首先需要理解的是android中是如何去绘制这些UI的呢?这里我只讲我所理解的, ...
- HDL之Bitwise operation
1 Verilog 1.1 Bitwise operator Bitwise operators perform a bit wise operation on two operands. They ...
- C++:数据流和缓冲区
(1):C++之自定义的input缓冲区 原文链接:http://hi.baidu.com/nicker2010/item/d0c4cd2a7caf27c4ddf69aeb input stream用 ...
- 数据库_数据分片与mycat服务
1.数据分片; 2.部署mycat服务;3.基于mycat服务创建新库新表. 一,数据分片 1.数据分片,也叫分库分表,即将存放在一台数据库服务器中的数据,按照特定方式进行拆分,分散存放到其它多台服务 ...
- switch 语句来选择要执行的多个代码块之一。
switch(n) { case 1: 执行代码块 1 break; case 2: 执行代码块 2 break; default: n 与 case 1 和 case 2 不同时执行的代码 }
- JDBC连接MySQL数据库(一)——数据库的基本连接
JDBC的概念在使用之前我们先了解一下JDBC的概念, JDBC的全称是数据库连接(Java Database Connectivity),它是一套用于执行SQL语句时的API,应用程序可以通过这套A ...
- WEBGL学习【十五】利用WEBGL实现三维场景的一般思路总结
实现三维场景载入操作的实现步骤: 主要知识点:着色器,纹理贴图,文件载入 实现思路: 获取canvas,初始化WEBGL上下文信息. 主要是实现WEBGL上下文的获取,设置视的大小,此时gl存储了WE ...
- Codeforces 787B Not Afraid( 水 )
链接:传送门 题意:判断 m 组数,如果某一组中出现负数就判断这一组中是否存在与之相反的数,如果每一组中都满足要求则输出 "NO" 反之输出 "YES" 思路: ...