因为第一部分是关于初始化的部分的,我就没有发布出来~

wsgi.py————第一部分

在分析这个模块之前, 需要了解一下WSGI, 大致了解了之后再继续~

get_current_url()函数

很明显,该函数的作用是获取当前url地址。 代码如下:

def get_current_url(environ, root_only=False, strip_querystring=False,
host_only=False, trusted_hosts=None):
"""
:param environ: the WSGI environment to get the current URL from.
:param root_only: set `True` if you only want the root URL.
:param strip_querystring: set to `True` if you don't want the querystring.
:param host_only: set to `True` if the host URL should be returned.
:param trusted_hosts: a list of trusted hosts, see :func:`host_is_trusted`
for more information.
"""
tmp = [environ['wsgi.url_scheme'], '://', get_host(environ, trusted_hosts)]
cat = tmp.append
if host_only:
return uri_to_iri(''.join(tmp) + '/')
#这里, temp将变成root_only的地址
cat(url_quote(wsgi_get_bytes(environ.get('SCRIPT_NAME', ''))).rstrip('/'))
cat('/')
if not root_only:
cat(url_quote(wsgi_get_bytes(environ.get('PATH_INFO', '')).lstrip(b'/')))
if not strip_querystring:
qs = get_query_string(environ)
if qs:
cat('?' + qs)
return uri_to_iri(''.join(tmp))

注意11~12行, 最开始那个append我也没懂, 网上也找不到, 于是我试了下:

>>> temp = [1,2,3]
>>> temp
[1, 2, 3]
>>> aa = temp.append
>>> aa(2)
>>> temp
[1, 2, 3, 2]

很明显, 当aa = temp.append之后,aa变成了一个函数, aa(1)等效于temp.append(1)

参数host_only的意思是只取host地址,比如http://www.baidu.com/xxx,其host地址就是http://www.baidu.com

函数最后return uri_to_iri, 是把该URI地址转换成IRI(IRI包含unicode字符,URI是ASCII字符编码)

get_query_string()函数

wsgi.py中, 有很多类似的函数, 用来获得对应的url字段, 这里我拿出一个来分析, 其他的都大同小异

def get_query_string(environ):
qs = wsgi_get_bytes(environ.get('QUERY_STRING', ''))
# QUERY_STRING really should be ascii safe but some browsers
# will send us some unicode stuff (I am looking at you IE).
# In that case we want to urllib quote it badly.
#上面那句我查阅了urllib.parse.quote()方法,意思好像是把部分敏感词汇使用%xx来隐藏, `safe`参数中的部分使用ascii编码,不用隐藏
return try_coerce_native(url_quote(qs, safe=':&%=+$!*\'(),'))

get_query_string(environ) 该函数的作用是把environ变量转换成latin-1编码(程序段中注释说ascii编码较安全, 但很多浏览器发送的是unicode编码的字串, 所以需要统一编码, latin-1向下兼容ascii)

接下来, 在返回值中我们可以看到url_quote函数, 查询源码:

def url_quote(string, charset='utf-8', errors='strict', safe='/:', unsafe=''):
"""URL encode a single string with a given encoding.""" if not isinstance(string, (text_type, bytes, bytearray)):
string = text_type(string)
if isinstance(string, text_type):
string = string.encode(charset, errors)
if isinstance(safe, text_type):
safe = safe.encode(charset, errors)
if isinstance(unsafe, text_type):
unsafe = unsafe.encode(charset, errors)
safe = frozenset(bytearray(safe) + _always_safe) - frozenset(bytearray(unsafe)) #去除unsafe的部分,并转换成bytearray
rv = bytearray()
for char in bytearray(string):
if char in safe:
rv.append(char)
else:
rv.extend(('%%%02X' % char).encode('ascii'))
return to_native(bytes(rv))

从代码中我们可以知道:传入的stringsafeunsafe参数将被转换成类型为string, 编码方式为charset的数据, 其中charset默认为utf-8, 可以自己指定。最后再把string转换成bytearray, 按规则输出

try_coerce_native 在源码中是try_coerce_native=_identity, _identity=lambda x: x,综合起来try_coerce_native(a) = a

在本代码段中,还有个很重要的东西:bytearray()

查阅文档,bytearray(source, encoding, errors) 一共有三个参数,第一个自然是需要转换的内容,第二个是编码方式

为了理解bytearray, 我写了如下的代码:

>>> string = 'aaaa'
>>> temp = bytearray(string)
Traceback (most recent call last):
File "<pyshell#50>", line 1, in <module>
temp = bytearray(string)
TypeError: string argument without an encoding

提示告诉我,需要增加编码方式,于是进行改进:

>>> string = 'aaaa'.encode('utf-8')
>>> temp = bytearray(string)
>>> print(temp)
bytearray(b'aaaa') #注意这个'b'

成功了,然后我又做了如下操作:

>>> for i in temp:
print(i, end=' ') 97 97 97 97

这个和预想的有点不一样啊,为什么不是输出4个a呢?

原来,我们把string编码成utf-8之后,放入了bytearray()中, temp自然也是utf-8编码的,当输出的时候,自然输出的是utf-8的内容了
同时,本例还说说明了bytearray()的对象是可迭代的

这样,我们就能明白url_quote()函数的意义了

在函数中,先把stringsafeunsafe转成utf-8编码,然后都转成可迭代的bytearray(), 逐位比对string中是否含有safe中的字符,如果有,则不转换,直接输出; 如果没有,则执行rv.extend(('%%%02X' % char).encode('ascii')),从而完成了url地址中query_string部分的转化(专业要求见get_query_string函数中的备注)

('%%%02X' % char): 前两个%%输出一个%, 后面%02X和C语言中一样: 输出2位十进制整数,不足2位的在前面补零

werkzeug源码阅读笔记(二) 上的更多相关文章

  1. werkzeug源码阅读笔记(二) 下

    wsgi.py----第二部分 pop_path_info()函数 先测试一下这个函数的作用: >>> from werkzeug.wsgi import pop_path_info ...

  2. Werkzeug源码阅读笔记(三)

    这次主要讲下werkzeug中的Local. 源码在werkzeug/local.py Thread Local 在Python中,状态是保存在对象中.Thread Local是一种特殊的对象,它是对 ...

  3. Werkzeug源码阅读笔记(四)

    今天主要讲一下werkzeug中的routing模块.这个模块是werkzeug中的重点模块,Flask中的路由相关的操作使用的都是这个模块 routing模块的用法 在讲解模块的源码之前,先讲讲这个 ...

  4. Detectron2源码阅读笔记-(二)Registry&build_*方法

    ​ Trainer解析 我们继续Detectron2代码阅读笔记-(一)中的内容. 上图画出了detectron2文件夹中的三个子文件夹(tools,config,engine)之间的关系.那么剩下的 ...

  5. Android源码阅读笔记二 消息处理机制

    消息处理机制: .MessageQueue: 用来描述消息队列2.Looper:用来创建消息队列3.Handler:用来发送消息队列 初始化: .通过Looper.prepare()创建一个Loope ...

  6. Apollo源码阅读笔记(二)

    Apollo源码阅读笔记(二) 前面 分析了apollo配置设置到Spring的environment的过程,此文继续PropertySourcesProcessor.postProcessBeanF ...

  7. 【原】FMDB源码阅读(二)

    [原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...

  8. Three.js源码阅读笔记-5

    Core::Ray 该类用来表示空间中的“射线”,主要用来进行碰撞检测. THREE.Ray = function ( origin, direction ) { this.origin = ( or ...

  9. jdk源码阅读笔记-LinkedHashMap

    Map是Java collection framework 中重要的组成部分,特别是HashMap是在我们在日常的开发的过程中使用的最多的一个集合.但是遗憾的是,存放在HashMap中元素都是无序的, ...

随机推荐

  1. 火狐的打开3D效果

    最近研究网页的时候,想看看一个页面中盒子的层次问题,点击右键查看元素的后,没有发现3D效果的按钮. 在网上百度后说要什么显卡支持,以为是公司的电脑用的是集显,就没有这个功能.回去用自己的笔记本后,发现 ...

  2. 《Programming WPF》翻译 第7章 6.视频和3-D

    原文:<Programming WPF>翻译 第7章 6.视频和3-D 虽然详细地讨论视频和3-D超越了这本书的范围,但是获得这些特征的支持是值得的. 视频由MediaElement类型支 ...

  3. PowerShell官方的MSDN

    https://msdn.microsoft.com/en-us/powershell/mt173057.aspx 官方还咋github上放置了  扩展模块. 比如 web iis部署.sqlserv ...

  4. ctrl+alt+l:linux 锁屏 win+l:windows锁屏

    ctrl+alt+l:linux 锁屏, system->preferences->screensaver设置锁屏时间 win+l:windows锁屏

  5. 第11讲- Android中进程及其优先级

    第11讲Android中进程及其优先级 进程与线程: 进程:操作系统结构的基础,资源分配的最小单元,一个操作系统包括多个进程: 线程:线程存在于进程当中,是操作系统调试执行的最小单元,一个进程包括多个 ...

  6. [每日一题] OCP1z0-047 :2013-08-17 EXTERNAL TABLE――加载数据 ............................56

    正确答案:C 一.对答案解释: A.       TYPE:有两个选可供选择: 1.        ORACLE_LOADER:传统方式,与SQLLDR一样,参数从多,应用较多. 2.         ...

  7. VS2008快捷键_大全

    Ctrl+B,C: 清除全部标签 Ctrl+I: 渐进式搜索 Ctrl+Shift+I: 反向渐进式搜索 Ctrl+F: 查找 Ctrl+Shift+F: 在文件中查找 F3: 查找下一个 Shift ...

  8. phpStudy + JspStudy 2014.10.02 下载

    phpStudy + JspStudy 2014.10.02 下载 目标:让天下没有难配的php环境. phpStudy Linux版&Win版同步上线 支持Apache/Nginx/Teng ...

  9. jquery模拟checkbox效果,以及background-size在jquery中的使用。

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  10. php使用session来保存用户登录信息

    php使用session来保存用户登录信息 使用session保存页面登录信息 1.数据库连接配置页面:connectvars.php <?php //数据库的位置 define('DB_HOS ...