第三章 URL与视图
配置文件两种方式详解
先讲两种直接传参:
直接简单传参
app =Flask(__name__) app.config['DEBUG']=True
app.config.update(
DEBUG=true,
SECRET_KEY='xxxx'
)
1.使用app.config.from_object的方式加载配置文件
- 导入import config
- 使用app.config.from_object(config)
2.使用app.config.from_pyfile的方式加载配置文件:
- 这种方式不需要import,直接使用app.config.from_pyfile('config.py')。
- 注意这个地方,必须要写文件的全名以及后缀名。
- 加载配置文件,不局限于只能使用py文件,普通的txt文件同样也适合。
- 传递silent=True,则静态文件没有找到的时候,不会抛出异常。
为什么需要url_for:
1. 将来如果修改了URL,但没有修改该URL对应的函数名,就不用到处去替换URL。
2. url_for会自动的处理那些特殊的字符,不需要手动去处理。
url = url_for('login',next='/')
# 会自动的将/编码,不需要手动去处理。
# url=/login/?next=%2F
URL中两种方式传参
第一种:使用在视图函数的path的形式(将参数嵌入到路径)
第二种:使用查询字符串的方式,就是通过"?key=value"的形式传递的
如果这个页面的想要做`SEO`优化,就是被搜索引擎搜索到,那么推荐使用第一种形式(path的形式)
如果不在乎搜索引擎优化,那么就可以使用第二种(查询字符串的形式)
一个URL要与执行函数进行映射,使用的是@app.route 装饰器。app.route装饰器中,可以指定URL的规则来进行更加详细的映射,比如现在要映射一个文章详情的URL,文章详情的URL是/article/le/,id有可能为1、2、3.那么可以通过以下方式:
@app.route('/detail/<id>/')
def detail(id):
return 'detail'+id
其中<id>,尖括号是固定写法,语法为<variable-name),variable_name 里默认的数据类型是字符串。如果需要指定类型,则要写成<converter:variable-name,其中converter就是类型名称,可以有以下几种:
- ·string:默认的数据类型,接受没有任何斜杠\ or /的文本。
- ·int:接受整形。
- ·float:接受浮点类型。
- ·path:和string的类似,但是接受料杠。
- -uuid:只接受uuid字符串。
- ·any:可以指定多种踏径
这个通过几个例子来进行说明:
@app.route('/<any(blog,article):url_path>/<id>/')
def detail(url_path,id):
if url_path == 'blog':
return '博客详情:%s' % id
else:
return '博客详情:%s' % id
对any进行补充:有点像我们学过的枚举。在any里面枚举出所有的可能。
@app.route('/p/<float:article_id>')
def article_detail(article_id):
return '您请求的文章是:%s' % article_id
如果不想定制子路径来传递参数,也可以通过传统的?=的形式来传递参数,例如:/article?id=xxx,这种情况下,可以通过request.args.get("id")来获取id的值。如果是post方法,则可以通过request.form.get("id")未进行获取。
@app.route('/d/')
def d():
wd = request.args.get('wd')
ie = request.args.get('ie')
print('ie:',ie)
return '您通过查询字符串的方式传递的参数是:%s' % wd
url_for使用详解
url_for的基本使用:
- url_for第一个参数,应该是视图函数的名字的字符串。
- 后面的参数就是传递给url:
- 如果传递的参数之前在url中已经定义了,那么这个参数就会被当成path的形式给url。
- 如果这个参数之前没有在url中定义,那么将变成查询字符串的形式放到url中。
3.url的返回值也是字符串
@app.route('/')
def hello_world(): return url_for('loginFunc',next='')
#url_for的返回值是字符串
# /login/?next=1 @app.route('/login/')
def loginFunc():
return 'login界面:'
@app.route('/')
def hello_world(): return url_for('loginFunc2',next='')
#url_for的返回值是字符串
# /login/1 @app.route('/login/<next>')
def loginFunc2(next):
print(next)
return 'login--next--界面:'
自定义URL转换器
笔者认为自定转化器更准确的是自定义URL的数据类型,int、string、path没法满足业务需求。
我们先以int的数据格式去了解数据格式
@app.route('/user/<int:user_id>/')
def user_profile(user_id):
return '您输入的user_id为:%s' % user_id
自定义"手机号"的数据转化器
# 一个url中,含有手机号码的变量,必须限定这个变量的字符串格式满足手机号码的格式
class TelephoneConveter(BaseConverter):
regex = r'1[85734]\d{9}'
#必须添加到converters中
app.url_map.converters['tel'] = TelephoneConveter @app.route('/telephone/<tel:my_tel>/')
def my_tel(my_tel):
return '您的手机号码是:%s' % my_tel
# 用户在访问/posts/a+b/
class ListConverter(BaseConverter):
def to_python(self, value):
return value.split('+') def to_url(self, value):
return "+".join(value)
# return "hello" app.url_map.converters['list'] = ListConverter @app.route('/posts/<list:boards>/')
def posts(boards):
print(boards)
return "您提交的板块是:%s" % boards @app.route('/')
def hello_world():
print('='*30)
return url_for('posts',boards=['a','b'])
页面跳转和重定向
重定向分为永久性重定向和暂时性重定向,在页面上体现的操作就是浏览器会从一个页面自动跳转到另外一个页面。比如用户访问了一个需要权限的页面,但是该用户当前并没有登录,因此我们应该给他重定向到登录页面。
·永久性重定向:
http的状态码是301,多用于旧网址被废弃了要转到一个新的网址确保用户的访问,最经典的就是京东网站,你输入www.jingoong.con的时候,会被重定向到www.jd.com,因为jngdong.con这个网址已经被废弃了,被改成30.con,所以这种情况下应该用永久重定向。
·暂时性重定向:
http的状态码量302,表示页面的暂时性跳转。比如访问一个需要权限的网址,如果当前用户没有登示,应该重定问到登录页面,这种情况下,应该用暂时性重定问。
在flask中,重定向是通过flask.redirect(location,code=302)这个函数来实现的,1ocation表示需要重定向到的URL,应该配合之前讲的ur1_for()函效来使用,code表示采用哪个重定向,默认是302也即临时性重定向,可以修改成301来实现永久性重定向。
下面是京东的网站的永久重定向:
下面是淘宝【已买到宝贝】的临时性重定向:
案例代码如下:
flask有一个函数redirect可以重定向
from flask import Flask,request,redirect,url_for app = Flask(__name__) @app.route('/')
def hello_world():
return 'Hello World!' @app.route('/login/')
def login():
return '这是登录页面' @app.route('/profile/')
def profile():
if request.args.get('name'):
return '个人中心页面'
else:
return redirect(url_for('login'))
视图函数Response返回值详解
关于响应(Response):
视图函数的返回值会被自动转换为一个响应对象,F1ask的转换逻辅如下:
- ·如果返回的是一个合法的响应对象,则直接返回。
- ·如果返回的是一个字符串,那么Flask会重新创建一个werkzeug.wrapper3.Response对象,Response将该字符串作为主体,状态码为200,NTE类型为text/html,然后返回该Response对象。
- ·如果返回的是一个元组,元祖中的数据类型是(response,status,headers),status值会覆盖认的200状态码,headers可以是一个列表或者字典,作为额外的消息头。
- ·如果以上条件都不满足,Flask会假设返回值是一个合法的WSGIT应用程序,并通过Response.force_type(rv,request.environ)转换为一个请求对象。
以下将用例子来进行说明:
1.return-->Response 直接使用Response创建:
from flask import Flask,Response
#或者是
#from werkzeug.wrappers import Response @app.route('/')
def hello_world():
res=Response('Hello Worldl1',status=200,content_type='/text/html')
return res
#下面的return语句其实是上面的Response的简化
# return'Hello World!'
2.可以使用make_response函数来创建Response对象,这个方法可以设置额外的数据,比如设置cookie,header信息
3.返回一个元祖
@app.route("/list2/")
def list2():
return "list2",200,{"x-name":"wqbin"}
4.自定义一个Response子类去调用force_type实现返回json
note:最新的flask已经支持返回字典类型,通过调用jsonify
- ·必须继承自Response类。
- ·实现类方法force_type(cls,rv,environ=None)。
- ·必须指定app.response_class为你自定义的Response
以下将用一个例子来进行讲解,RestfulAPI都是通过json的形式进行传递,如果你的后台跟前台进行交互,所有的URL都是发送json数据,
那么此时你可以自定义一个叫做]SONResponse的类来代替Flask自带的Response类:
from flask import Flask,Response,jsonify
# flask = werkzeug+sqlalchemy+jinja2
# import json 使用自带json去解析会报错 app = Flask(__name__) # 将视图函数中返回的字典,转换成json对象,然后返回
# restful-api
class JSONResponse(Response): @classmethod
def force_type(cls, response, environ=None):
"""
这个方法只有视图函数返回非字符、非元组、非Response对象
才会调用
response:视图函数的返回值
"""
if isinstance(response,dict):
# jsonify除了将字典转换成json对象,还将改对象包装成了一个Response对象
response = jsonify(response)
return super(JSONResponse, cls).force_type(response,environ) app.response_class = JSONResponse @app.route('/list3/')
def list3():
return {'username':'wqbin','age':24} if __name__ == '__main__':
app.run(debug=True,port=8000)
5.小用法设置cookie
@app.route('/list1/')
def list1():
resp = Response('list1')
resp.set_cookie('country','china')
return resp
第三章 URL与视图的更多相关文章
- day052 django第三天 url和视图
一.基本格式 from django.conf.urls import url from . import views #循环urlpatterns,找到对应的函数执行,匹配上一个路径就找到对应的函数 ...
- The Django Book 第三章 试图和URL配置
之前自学Django也有一段时间了,再过一个月就要入职新公司了(Python Django开发),即使现在还在入门级徘徊,再好好把Django基础过一遍吧. The Django Book 第三章 试 ...
- 《Django By Example》第三章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:第三章滚烫出炉,大家请不要吐槽文中 ...
- 【django基础补充之URL,视图,模版】
一.url路由配置 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个URL调用这段代 ...
- [转]TEC1401.Report开发技术总结 - 第三章 使用Oracle Reports开发报表-创建一个分组报表(2/4)
本文转自:http://blog.csdn.net/deepsea_allen/article/details/53900284 第三章 创建一个分组报表 1. 建立数据模型 数据模型用于 ...
- spring boot 笔记--第三章
spring boot 笔记 第三章,使用Spring boot 构建系统: 强烈建议支持依赖管理的构建系统,Maven或Gradle 依赖管理: Spring Boot的每版本都会提供它支持的依赖列 ...
- 第三章:Web表单
感谢作者 –> 原文链接 本文翻译自 The Flask Mega-Tutorial Part III: Web Forms 这是Flask Mega-Tutorial系列的第三部分,我将告诉你 ...
- Pro ASP.NET Core MVC 6th 第三章
第三章 MVC 模式,项目和约定 在深入了解ASP.NET Core MVC的细节之前,我想确保您熟悉MVC设计模式背后的思路以及将其转换为ASP.NET Core MVC项目的方式. 您可能已经了解 ...
- 使用Micrisoft.net设计方案 第三章Web表示模式
第三章Web表示模式 体系结构设计者在设计第一个作品时比较精简和干练.在第一次设计时,并清除自己做什么,因此比较小心谨慎.第二个作品是最危险的一个作品,此时他会对第一个作品做修饰和润色,以及把第一次设 ...
随机推荐
- 洛谷 题解 CF910C 【Minimum Sum】
当时看到这题一脸懵逼,莫名想到了复杂度为O(10000000000*n)的算法,然而肯定会超时(废话) 算法楼上楼下都说的很清楚了 很明显这题是要用每个字母的权值进行排序.然后依次进行赋值. \(\c ...
- 修改Ubuntu屏幕的分辨率
最近重新装了一下环境,用vnc连接服务器,发现分辨率过低,于是查了一下如何修改分辨率,将其调高. 编辑/etc/default/grub 搜索"#GRUB_GFXMODE=640x4 ...
- JavaSE基础(四)--Java基本数据类型
Java 基本数据类型 变量就是申请内存来存储值.也就是说,当创建变量的时候,需要在内存中申请空间. 内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据. 因此,通过定义不 ...
- 什么是 redis 的雪崩、穿透和击穿?
缓存雪崩 对于系统 A,假设每天高峰期每秒 5000 个请求,本来缓存在高峰期可以扛住每秒 4000 个请求,但是缓存机器意外发生了全盘宕机.缓存挂了,此时 1 秒 5000 个请求全部落数据库,数据 ...
- 关于SQLSERVER登录不了的情况
是这样的,本人为了复制一个数据库文件把默认数据库设置成了脱机状态.在此点击联机的时候SSMS显示重启,重启后在用windows登录显示无法打开默认数据库.用其他不适该默认数据库的账号可以登录.想问一下 ...
- java获取单张网页中img标签中的src
/** * 得到网页中图片的地址 */ public static List<String> getImgStr(String htmlStr) { List<String> ...
- (二)Spring中的ioc
目录 Spring的ioc操作 ioc底层使用的技术 ioc底层原理 ioc入门案例 bean管理(xml方式) IOC和DI的区别 Spring整合WEB的原理 Spring 整合的具体操作 Spr ...
- 洛谷P2178 [NOI2015]品酒大会 后缀数组+单调栈
P2178 [NOI2015]品酒大会 题目链接 https://www.luogu.org/problemnew/show/P2178 题目描述 一年一度的"幻影阁夏日品酒大会" ...
- 【Python基础】08_Python中的列表
1.列表的定义 List(列表)是Python中使用的 最频繁 的数据类型,其他语言通常叫数组 专门用于存储 一串信息 列表用 [] 定义,数据 之间用 , 分割 列表的 索引(位置) 从 0 开始 ...
- 【规律】A Rational Sequence
题目描述 An infinite full binary tree labeled by positive rational numbers is defi ned by:• The label of ...