前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >url传递参数_url encode

url传递参数_url encode

作者头像
全栈程序员站长
发布于 2022-11-08 09:30:37
发布于 2022-11-08 09:30:37
2.7K00
代码可运行
举报
运行总次数:0
代码可运行

Werkzeug 之URL 路由

原文链接http://werkzeug.pocoo.org/docs/0.12/routing/ 当需要组合控制器和视图函数时,我们需要一个调度器来实现。一个简单的实现方式是采用正则表达式匹测试路由信息,调用回调函数并返回结果。 Werkzeug 提供了一个类似Route[1]的强大功能.下文提到的所有对象都是从 werkzeug.routing 导入而不是 werkzeug

快速指南

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from werkzeug.routing import Map, Rule, NotFound, RequestRedirect
url_map = Map([
    Rule('/', endpoint='blog/index'),
    Rule('/<int:year>/', endpoint='blog/archive'),
    Rule('/<int:year>/<int:month>/',
        endpoint='blog/archive'),
    Rule('/<int:year>/<int:month>/<int:day>/', endpoint='blog/archive'),
    Rule('/<int:year>/<int:month>/<int:day>/<slug>',
         endpoint='blog/show_post'),
    Rule('/about', endpoint='blog/about_me'),
    Rule('/feeds/', endpoint='blog/feeds'),
    Rule('/feeds/<feed_name>.rss', endpoint='blog/show_feed')
])

def application(environ, start_response):
    urls = url_map.bind_to_environ(environ)
    try:
        endpoint, args = urls.match()
    except HTTPException, e:
        return e(environ, start_response)
    start_response('200 OK', [('Content-Type', 'text/plain')])
    return ['Rule points to %r with arguments %r' % (endpoint, args)]

上面代码的主要功能:首先我们创建一个Map对象来存储URL规则(Rule),其中Rule对象是以列表的形式放到Map中的。 每个Rule对象是一个字符串实例。这个字符串由一条规则和一个endpoint组成。endpoint的本质是rule所表示的视图的别名。多条rule可以对应一个endpoint,但必须是不同的参数构成的URL语句。

在WSGI应用中我们绑定url_map 和request对象,并返回一个新的 MapAdapter对象。此url_map 适配器通常用于为request匹配域名或生成域名。 方法MapAdapter.match()返回(endpoint, args)形式的元组,或者抛出异常: NotFound, MethodNotAllowed, 或RequestRedirect。

Maps, Rules and Adapters

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class werkzeug.routing.Map

Map类存储所有URL 规则和一些配置参数。影响程序全局路由规则的参数只能配置在Map实例之中。而其他的参数默认可以被每个规则重写。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class werkzeug.routing.MapAdapter
MapAdapter.build()

build方法接收force_external 参数,如果将其设置为True会显示完整的外部URL。只有当目标URL在 不同的子域名才会使用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> m = Map([
...     Rule('/', endpoint='index'),
...     Rule('/downloads/', endpoint='downloads/index'),
...     Rule('/downloads/<int:id>', endpoint='downloads/show')
... ])
>>> urls = m.bind("example.com", "/")
>>> urls.build("index", {})
'/'
>>> urls.build("downloads/show", {
  
  'id': 42})
'/downloads/42'
>>> urls.build("downloads/show", {
  
  'id': 42}, force_external=True)
'http://example.com/downloads/42'

由于URL不包含非ASCII数据,因此其总是返回字节形式的字符串。 附带的值会转换成unicode码附加在URL后边:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> urls.build("index", {
  
  'q': 'My Searchstring'})
'/?q=My+Searchstring'

在处理附加参数时,list会被解释成多值的形式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> urls.build("index", {
  
  'q': ['a', 'b', 'c']})
'/?q=a&q=b&q=c'
MapAdapter.dispatch(view_func, path_info=None, method=None, catch_http_exceptions=False)

完成分发处理功能。调用视图函数view_func,view_func的入参是endpoint 和一个字典参数。dispatch方法实现view函数查找,调用,并返回一个response对象或WSGI应用。 一个简单的dispatch 用法实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from werkzeug.wrappers import Request, Response
from werkzeug.wsgi import responder
from werkzeug.routing import Map, Rule
def on_index(request):
    return Response('Hello from the index')
url_map = Map([Rule('/', endpoint='index')])
views = {
  
  'index': on_index}
@responder
def application(environ, start_response):
    request = Request(environ)
    urls = url_map.bind_to_environ(environ)
    return urls.dispatch(lambda e, v: views[e](request, **v),
                         catch_http_exceptions=True)
if__name__=='__main__':
    fromwerkzeug.servingimportrun_simple
    run_simple('localhost',4000,application)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MapAdapter.match()

路由规则匹配方法。 匹配举例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> m = Map([
...     Rule('/', endpoint='index'),
...     Rule('/downloads/', endpoint='downloads/index'),
...     Rule('/downloads/<int:id>', endpoint='downloads/show')
... ])
>>> urls = m.bind("example.com", "/")
>>> urls.match("/", "GET")
('index', {})
>>> urls.match("/downloads/42")
('downloads/show', {
  
  'id': 42})

URLs丢失的例子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>> urls.match("/downloads")
Traceback (most recent call last):
  ...
RequestRedirect: http://example.com/downloads/
>>> urls.match("/missing")
Traceback (most recent call last):
  ...
NotFound: 404 Not Found
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class werkzeug.routing.Rule

Rule代表一种URL模式。入参endpoint可以使任意对象,例如一个方法的引用,字符或者数字等等。推荐使用字符串,因为endpoint通常用于URL生成。

Rule 工厂类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class werkzeug.routing.RuleFactory
在实现复杂URL配置时,可以通过继承RuleFactory来避免重复的工作
class werkzeug.routing.Subdomain(subdomain, rules)
子域名配置
In [7]: from werkzeug.routing import *

In [8]: url_map = Map([
   ...:     Rule('/', endpoint='#select_language'),
   ...:     Subdomain('<string(length=2):lang_code>', [
   ...:         Rule('/', endpoint='index'),
   ...:         Rule('/about', endpoint='about'),
   ...:         Rule('/help', endpoint='help')
   ...:     ])
   ...: ])

In [9]: url_map
Out[9]:
Map([<Rule '/' -> #select_language>,
 <Rule '<lang_code>|/about' -> about>,
 <Rule '<lang_code>|/help' -> help>,
 <Rule '<lang_code>|/' -> index>])
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class werkzeug.routing.Submount(path, rules)
与Subdomain类似,只不过URL前缀是给定的字符串
In [10]: url_map = Map([
    ...:     Rule('/', endpoint='index'),
    ...:     Submount('/blog', [
    ...:         Rule('/', endpoint='blog/index'),
    ...:         Rule('/entry/<entry_slug>', endpoint='blog/show')
    ...:     ])
    ...: ])

In [11]: url_map
Out[11]:
Map([<Rule '/blog/' -> blog/index>,
 <Rule '/' -> index>,
 <Rule '/blog/entry/<entry_slug>' -> blog/show>])
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class werkzeug.routing.EndpointPrefix(prefix, rules)
EndpointPrefix前缀是给定的字符串
In [13]: url_map = Map([
    ...:     Rule('/', endpoint='index'),
    ...:     EndpointPrefix('blog/', [Submount('/blog', [
    ...:         Rule('/', endpoint='index'),
    ...:         Rule('/entry/<entry_slug>', endpoint='show')
    ...:     ])])
    ...: ])

In [14]: url_map
Out[14]:
Map([<Rule '/blog/' -> blog/index>,
 <Rule '/' -> index>,
 <Rule '/blog/entry/<entry_slug>' -> blog/show>])

Rule 模板

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class werkzeug.routing.RuleTemplate(rules)

举例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from werkzeug.routing import Map, Rule, RuleTemplate
resource = RuleTemplate([
    Rule('/$name/', endpoint='$name.list'),
    Rule('/$name/<int:id>', endpoint='$name.show')
])
url_map = Map([resource(name='user'), resource(name='page')])

实现Rule规则的参数化。

Custom Converters(定制转换器)

通过继承BaseConverter并传入新的Converters和url_map参数来实现定制的转换器。 举例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from random import randrange
from werkzeug.routing import Rule, Map, BaseConverter, ValidationError
class BooleanConverter(BaseConverter):
def __init__(self, url_map, randomify=False):
   super(BooleanConverter, self).__init__(url_map)
   self.randomify = randomify
   self.regex = '(?:yes|no|maybe)'
def to_python(self, value):
        if value == 'maybe':
            if self.randomify:
                return not randrange(2)
            raise ValidationError()
        return value == 'yes'
def to_url(self, value):
        return value and 'yes' or 'no'
url_map = Map([
    Rule('/vote/<bool:werkzeug_rocks>', endpoint='vote'),
    Rule('/vote/<bool(randomify=True):foo>', endpoint='foo')
], converters={
  
  'bool': BooleanConverter})

[1]http://routes.readthedocs.io/en/latest/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/185134.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月6日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Android OpenCV(三十七):轮廓外接多边形
该方法用于求取输入二维点集合的最小外接矩形。返回值为RotateRect对象。RotateRect类型和Rect类型虽然都是表示矩形,但是在表示方式上有一定的区别。通过查看成员变量可以很明显的看到差异。Rect是通过左上角的坐标来定位,默认横平竖直,然后通过宽高确定大小。而RotateRect则是通过center确定位置,angle结合宽高,计算各顶点的坐标,从而确定矩形。
Vaccae
2021/07/07
1.4K0
Android OpenCV(三十七):轮廓外接多边形
​LeetCode刷题实战469:凸多边形
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,后续每天带大家做一道算法题,题目就从LeetCode上面选 !
程序员小猿
2021/12/17
4610
​LeetCode刷题实战469:凸多边形
一种快速判断点在多边形内的算法
前面我们讲到,射线法的主要思路就是计算射线穿越多边形边界的次数。那么对于点在多边形的边上这种特殊情况,射线出发的这一次,是否应该算作穿越呢?
sunsky
2022/09/08
1.3K0
Yolo实用指南(step by step)之二labelme进行数据标注
在机器学习和神经网络中,关于猫狗的识别就像各语言的hello world一样,我也不例外,神经网络是一种监督学习方法,预想取之必先与之,所以首先是数据标注,通过labelme进行数据标注,将图片和标签进行关联,再通过神经网络对图片和标签进行训练也就是学习的过程,最后通过测试集进行模型预测也就是验证的过程。
python与大数据分析
2022/12/13
2.8K0
Yolo实用指南(step by step)之二labelme进行数据标注
labelme:图像数据标注
深度学习第一步就是制作数据集,手动去标注一些数据。本文将介绍一个用于图像数据标注的软件:labelme,并介绍它的安装方法,使用方法等。
数据科学工厂
2023/02/27
5K0
labelme:图像数据标注
图形编辑器基于Paper.js教程08:鼠标画封闭的自由多边形,靠近起点自动关闭
在这篇技术博客中,我们将深入探讨如何使用 Paper.js 实现一个基本的图形绘制应用,允许用户在画布上绘制封闭的多边形。Paper.js 是一个强大的向量图形脚本库,它简化了在网页上进行图形和交互式界面设计的过程。本文主要围绕上述代码进行解析,揭示其实现逻辑和关键技术点。
拿我格子衫来
2024/07/15
3160
图形编辑器基于Paper.js教程08:鼠标画封闭的自由多边形,靠近起点自动关闭
判断点在多边形内算法的C++实现
判断平面内点是否在多边形内有多种算法,其中射线法是其中比较好理解的一种,而且能够支持凹多边形的情况。该算法的思路很简单,就是从目标点出发引一条射线,看这条射线和多边形所有边的交点数目。如果有奇数个交点,则说明在内部,如果有偶数个交点,则说明在外部。如下图所示:
charlee44
2019/08/13
6.1K0
QGIS小妙招-创建TAC边界
之前分享过 使用 mapinfo 创建 TAC 边界的方法,现如今,mapinfo 已经被禁用了,开源软件 QGIS 在通信网络优化工作中开始大量应用,今天分享一下如何使用 QGIS 创建 TAC 边界。
披头
2022/08/22
1.9K0
QGIS小妙招-创建TAC边界
低多边形(Low-Poly)简介及相关素材分享下载
最近一直缺乏原创文章,只因被各种琐事所累,难以静下心来写文章。这篇文章也非原创,分享下我知道的一些低多边形(Low-Poly)的素材。低多边形(Low-Poly)最近火得一塌糊涂——如果你关注国外的设计圈子的话。 低多边形(Low-Poly)简介 Low Poly 原是 3D 建模中的术语,指使用相对较少的点线面来制作的低精度模型,一般网游中的模型都属于低模。而现在,Low Poly 进入了平面设计领域,继扁平化(Flat Design)、长阴影(Long Shadow)之后,低多边形(Low Poly)火
Jeff
2018/01/19
2.3K0
低多边形(Low-Poly)简介及相关素材分享下载
凸包多边形最小外切矩形算法
其实我对算法不是很在行, 但是项目中有用到某种算法 来实现某种功能, 也得硬着头皮来实现. 这是很早之前的一个项目了, 要计算一个凸包多边形最小外切矩形 . 遇到这种情况肯定是束手无策.. 在翻了一些资料之后. 终于完成了.
chuchur
2022/10/25
8780
凸包多边形最小外切矩形算法
讲解python多边形裁剪
在计算机图形学中,多边形裁剪是一个常用的技术,用于确定多边形与给定裁剪窗口之间的交集。通过裁剪,我们可以剔除不在裁剪窗口范围内的部分,从而减少图形处理的计算量,并加速渲染过程。 Python提供了各种库和算法来实现多边形裁剪。在本篇文章中,我们将使用shapely库来进行多边形的裁剪操作。shapely是一个Python库,提供了一些用于处理几何图形数据的功能。
大盘鸡拌面
2023/12/26
5690
【OpenCV入门之九】轮廓查找和多边形包围轮廓
学习计算机视觉最重要的能力应该就是编程了,为了帮助小伙伴尽快入门计算机视觉,小白准备了【OpenCV入门】系列。新的一年文章的内容进行了很大的完善,主要是借鉴了更多大神的文章,希望让小伙伴更加容易理解。如果小伙伴觉得有帮助,请点击一下文末的“好看”鼓励一下小白。
小白学视觉
2019/06/02
1.9K0
geotools中泰森多边形的生成
泰森多边形又叫冯洛诺伊图(Voronoi diagram),得名于Georgy Voronoi,是由一组由连接两邻点直线的垂直平分线组成的连续多边形组成。
牛老师讲GIS
2018/10/23
2.1K0
geotools中泰森多边形的生成
设计新趋势:Low Poly 低多边形风格
Low Poly 原是 3D 建模中的术语,指使用相对较少的点线面来制作的低精度模型,一般网游中的模型都属于低模。而现在,Low Poly 进入了平面设计领域,继扁平化(Flat Design)、长阴影(Long Shadow)之后,低多边形(Low Poly)火速掀起了一个新的设计风潮。
慕白
2018/08/03
1.8K0
设计新趋势:Low Poly 低多边形风格
Fabric.js 拖拽顶点修改多边形形状
其实 Fabric.js 官网也有这个demo:Fabric.js demos · Custom controls, polygon 。但这个demo可能对于刚接触 Fabric.js 的工友来说有点过于复杂,所以本文就把该demo进一步简化,简化到老奶奶也能看得懂的!
德育处主任
2023/05/11
2.1K0
Fabric.js 拖拽顶点修改多边形形状
带你实现一个简单的多边形编辑器
多边形编辑器少数见于一些图片标注需求,常见于地图应用,用来绘制区域,比如高德地图:
街角小林
2022/06/15
1.2K0
带你实现一个简单的多边形编辑器
【从零学习OpenCV 4】轮廓外接多边形
由于噪声和光照的影响,物体的轮廓会出现不规则的形状,根据不规则的轮廓形状不利于对图像内容进行分析,此时需要将物体的轮廓拟合成规则的几何形状,根据需求可以将图像轮廓拟合成矩形、多边形等。本小节将介绍OpenCV 4中提供的轮廓外接多边形函数,实现图像中轮廓的形状拟合。
小白学视觉
2020/02/20
3.9K0
【从零学习OpenCV 4】轮廓外接多边形
判断点是否在多边形内的Python实现及小应用(射线法)
判断一个点是否在多边形内是处理空间数据时经常面对的需求,例如GIS软件中的点选功能、根据多边形边界筛选出位于多边形内的点、求交集、筛选不在多边形内的点等等。判断一个点是否在多边形内有几种不同的思路,相应的方法有:
蛰虫始航
2019/09/29
9.9K2
判断点是否在多边形内的Python实现及小应用(射线法)
机器视觉------- SciSmart图像定位-ROI校正算法
感兴趣区域(ROI,region of interest),在机器视觉、图像处理中,在被处理的图像上以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域,简称ROI。在图像处理领域,感兴趣区域是从图像中选择的一个图像区域,这个区域是图像分析所关注的重点。圈定该区域以便进行进一步处理,或使用ROI圈定你想处理的目标,可以减少处理时间,提高精度。
小白学视觉
2021/08/06
1.6K0
labelme:图像数据标注
深度学习第一步就是制作数据集,手动去标注一些数据。本文将介绍一个用于图像数据标注的软件:labelme,并介绍它的安装方法,使用方法等。
数据科学工厂
2023/01/19
2.1K0
推荐阅读
相关推荐
Android OpenCV(三十七):轮廓外接多边形
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档