27.Python Web 编程基础

本文涉及的产品
云解析 DNS,旗舰版 1个月
云解析DNS,个人版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 27.Python Web 编程基础

1.认识HTTP

HTTP(hyper text transfer protocol,超文本传输协议)是基于B/S架构进行通信的应用层协议,是一种简单的请求/响应协议,运行在TCP协议之上。作为万维网(WWW)的基础,是互联网上应用最为广泛的一种网络协议。HTTP指定了浏览器发送给Web服务器消息的格式和规则,以及Web服务器响应给浏览器消息的格式和规则。


浏览器作为HTTP客户端通过URL向HTTP服务端(Web服务器)发送所有请求。Web服务器在接收到请求后,向客户端发送响应信息。HTTP默认端口号为80,也可以为8080或者其它端口。


HTTP 具有3个特性:

  • 无连接。无连接就是每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答,即断开连接。
  • 无状态。HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。
  • 媒体独立。HTTP要求客户端和服务器仅知道处理数据的基本方法,因此任何类型的数据都可以通过HTTP发送。

Web 服务器(Web server)也称网页服务器,主要提供网上信息浏览服务。Web 服务器可以响应一个静态网页、图片,或者进行页面跳转,或者把动态动态响应的内容委托给其他程序,如CGI脚本、PHP脚本、Python脚本、JavaScript脚本等,这些服务器的程序通常生成一个HTML类型的文档,响应给客户端,方便浏览器进行浏览。目前主流的三大Web服务器是Apache、Nginx、IIS。


网络半应用程序包含两种不同的开发架构:


1)C/S架构。就是Client与Server的缩写,即客户端与服务端架构。这里的客户端一般指客户端应用程序,如QQ、微信、网盘、优酷等软件或APP。


2)B/S架构。就是Brower与Server的缩写,即浏览器端与服务器端架构。Brower其实也是一种Client客户端,只是不用安装程序。

2.Web框架概述

Web框架是指提供一组Python包,封装了网络应用底层的协议、线程、进程等内容。

四大主流Python网络框架:

Django:Django 是企业级Web开发框架,特点是开发速度快、代码少、可扩展性强。采用MTV(Model、Template、View)模型组织资源,框架功能丰富,模版扩展选择最多。

Tornado:Tornado 是一个基于异步网络功能库的Web开发框架,它能够支持几万个开放连接,Web服务高效稳定。适合并发场景下的Web系统。

Flask:Flask 是一个年轻的Web开发框架。仅提供Web服务器支持,不提供全栈开发支持,特别适合小微、原型系统的开发。

Twisted:Twisted 是一个用Python语言编写的事件驱动的网络框架,对于追求服务器程序性能的应用,Twisted 框架是一个很好的选择。

相对于Python的其他Web框架,Django的功能是最完整的,也是最整数的网络框架,特点如下:


完善的文档。

集成数据访问组件:Django的Model层自带数据库ORM组件,使开发者无须学习其他数据库访问技术。

强大的URL映射技术:Django使用正则表达式管理URL映射。

后台管理系统自动生成:开发者只需通过简单的几行配置和代码就可以实现完整的后台数据管理Web控制台。

错误信息非常完整:在开发调试过程中,如果出现运行异常,则Django可以提供非常完整的错误信息帮助定位问题。

Django 主要由以下几部分组成:


管理工具(management):一套内置的创建站点、迁移数据、维护静态文件的命令工具。

模型(model):提供数据访问接口和模块,包括数据字段、元数据、数据关系等定义及操作。

视图(view):Django的视图层封装了HTTP Request 和 Response的一系列操作和数据流,其主要功能包括URL映射机制、绑定模版等。

模版(template):是一套Django自己的页面渲染模版语言,用于若干内置的Tags和Filters定义页面的生成方式。

表单(form):通过内置的数据类型和控件生成HTML表单。

管理站(admin):通过声明需要管理demos,快速生成后台数据管理网站。

3.URL操作

在万维网(WWW)上,每一信息资源都有统一的且在网上唯一的地址,该地址就叫URL(uniform resource locator,统一资源定位器),也称网络地址。

'''
协议类型://服务器地址[:端口号]/路径/文件名[?参数1=值1&参数2=值2...]|[#ID]
scheme://netloc/path;params?query#fragment
协议0://域名1/路径2;参数3?查询条件4#锚点5
每个属性都是字符串,如果URL中不存在对应的元素,则属性值为空字符串
netloc属性值包含username、password、hostname、post
'''

# 示例
http:website.com/goods/search.php?term=apple
# website.com 表示服务器的域名
# search.php 是服务器端的一个脚本文件,后面的是参数
# search.php?term=apple 相对路径

如果端口号与相关协议默认值不同,则需要包含端口号。常用协议类型包括HTTP、mailto、file、FTP等,具体说明如下:

  • HTTP:超文本传输协议资源。
  • HTTPS:用安全套接字层传送的超文本传输协议。
  • FTP:文件传输协议。
  • mailto:电子邮件地址。
  • file:当地电脑或网上分享的文件。
  • news:Usenet新闻组。

解析URL

使用urllib.parse模块中的urlparse()方法解析URL字符串。语法和示例:

'''
urllib.parse.urlparse(urlstring,scheme='',allow_fragments=True)
urlstring:必填项,即待解析的URL字符串
scheme:可选参数,设置默认协议,如HTTP、HTTPs等
allow_fragments:可选参数,设置是否忽略fragment,默认为True。
如为False,fragment部分被忽略,被解析为path、params、query的一部分,而fragment为空。
'''
# 示例
from urllib.parse import urlparse
u = urlparse('http://www.baidu.com/index.html;user?id=5#comment')
print(type(u)) # <class 'urllib.parse.ParseResult'>
print(u) 
# 输出:ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5', fragment='comment')
print(u[0]) # http
print(u.path) # /index.html

拼接URL

使用加号运算符可以快速拼接URL字符串,但是如果两个URL字符串不规则,拼接时就会出错误。

使用urljoin()方法可以安全拼接各种格式的URL字符串。

urljoin(base,url[,allow_fragments])
该方法以参数base为基地址,与参数url相对地址相结合,返回一个绝对地址的url
  • 如果参数base不以'/'结尾,参数url不以'/'开头,那么base最右边的文件名及其后面部分被删除,然后与url直接。
  • 如果参数base以'/'结尾,参数url不以'/'开头,那么base最右边的文件名及其后面部分被删除,然后与url直接。
  • 如果参数url以'/'开头,那么base将删除路径部分及其后面字符串,再与url直接连接。
  • 如果参数url'../'开头,那么base将删除文件名其后面部分,以及其父目录字符串,再与url直接连接。
from urllib.parse import urljoin
u1 = urljoin('http://www.baidu.com/sub/a.html','b.html')
print(u1)   # http://www.baidu.com/sub/b.html
u2 = urljoin('http://www.baidu.com/sub/a.html','/b.html')
print(u2)   # http://www.baidu.com/b.html
u3 = urljoin('http://www.baidu.com/sub/a.html','sub2/b.html')
print(u3)   # http://www.baidu.com/sub/sub2/b.html
u4 = urljoin('http://www.baidu.com/sub/a.html','/sub2/b.html')
print(u4)   # http://www.baidu.com/sub2/b.html
u5 = urljoin('http://www.baidu.com/sup/sub/a.html','/sub2/b.html')
print(u5)   # http://www.baidu.com/sub2/b.html
u6 = urljoin('http://www.baidu.com/sup/sub/a.html','../b.html')
print(u6)   # http://www.baidu.com/sup/b.html

分解URL

使用urlsplit()方法可以分解URL字符串,返回一个包含5个元素的,可迭代的SplitResult对象,其用法和功能与urlparse()相似。不同点是urlsplit()方法在分割时,path和params属性不被分割。

使用urlparse.urlunsplit(parts)方法可以将通过urlsplit()方法生成的SplitResult对象组合成一个URL字符串。

from urllib.parse import urlsplit,urlparse
url = 'https://username:password@www.baidu.com:80/index.html;parameters?name=tom#example'
print(urlsplit(url))
'''
SplitResult(scheme='https', netloc='username:password@www.baidu.com:80', path='/index.html;parameters', query='name=tom', fragment='example')
'''
print(urlparse(url))
'''
ParseResult(scheme='https', netloc='username:password@www.baidu.com:80', path='/index.html', params='parameters', query='name=tom', fragment='example')
'''

编码和解码URL

编码和解码方法如下:

  • quote():对URL字符串进行编码。
  • unquote():对URL字符串进行解码。
  • quote_plus():与quote()方法相同,进一步将空格表示成+符号。
  • unquote_plus():与unquote()方法相同,进一步将+符号变成空格。

quote()方法格式如下:

'''
quote(string,safe='/',encoding=None,errors=None)
string:表示待编码的字符串。
safe:设置不需要转码的字符,以字符列表形式传递,默认不对斜杆(/)字符进行转码。
encoding:指定转码的字符的编码类型,默认为UTF-8
errors:设置发送异常时的回调函数
'''
from urllib.parse import quote,unquote
url = 'https://www.baidu.com/s?wd=住院'
res1 = quote(url) # 编码
print(res1) # https%3A//www.baidu.com/s%3Fwd%3D%E4%BD%8F%E9%99%A2
res2 = unquote(res1) # 解码
print(res2) # https://www.baidu.com/s?wd=住院
res3 = quote(url,safe=';/?:@&=+$,',encoding='utf-8') # 仅对需要的字符串进行编码
print(res3) # https://www.baidu.com/s?wd=%E4%BD%8F%E9%99%A2
res4 = unquote(res1,encoding='utf-8')  # 解码
print(res4) # https://www.baidu.com/s?wd=住院

编码查询参数

使用url lib.parse模块的urlencode()方法可以对查询参数进行编码,也就是将字典类型的数据格式化为查询字符串,以键=值的形式返回,方便在HTTP中进行传递。

from urllib.parse import urlencode,unquote
url = 'http://www.baidu.com/s?'
dict1 = {'wd':'百度翻译'}
url_data = urlencode(dict1) # 编码
print(url_data) # wd=%E7%99%BE%E5%BA%A6%E7%BF%BB%E8%AF%91
url_org = unquote(url_data) # 解码
print(url_org) # wd=百度翻译

相关文章
|
5天前
|
前端开发 JavaScript 网络协议
深入理解Python Web开发中的前后端分离与WebSocket实时通信技术
【7月更文挑战第18天】前后端分离采用Flask/Django框架,前端JavaScript框架如Vue.js与后端通过AJAX/Fetch通信。WebSocket提供实时双向通信,Python可借助websockets库或Flask-SocketIO实现。最佳实践包括定义清晰的接口规范,确保安全性(HTTPS,认证授权),优化性能,和健壮的错误处理。结合两者,打造高效实时应用。
20 1
|
1天前
|
开发框架 JSON API
震撼发布!Python Web开发框架下的RESTful API设计全攻略,让数据交互更自由!
【7月更文挑战第22天】在Python Web开发中,设计高效的RESTful API涉及选择框架(如Flask或Django)、明确资源及使用HTTP方法(GET, POST, PUT, DELETE)来操作数据。响应格式通常是JSON,错误处理也很重要。示例展示了使用Flask创建图书管理API,包括版本控制、文档化、安全性和性能优化是最佳实践。这样的API使数据交互更顺畅。
13 2
|
1天前
|
安全 API 网络架构
Python RESTful API设计新篇章,打造高效、易用、安全的Web服务接口,你准备好了吗?
【7月更文挑战第22天】在数字化转型中,RESTful API借助Python的Flask和Django REST Framework,提供高效、易用和安全的接口设计。Flask示例展示了简洁的CRUD操作,Swagger等工具增进API文档的易用性,而HTTPS、JWT和输入验证确保安全性。Python RESTful API设计涉及效率、可用性和安全,是不断进化的Web服务接口的关键。准备好踏上这一新篇章了吗?一起探索,创造卓越!
|
5天前
|
Python
告别低效!Python并查集:数据结构界的超级英雄,拯救你的编程人生!
【7月更文挑战第18天】并查集,数据结构超级英雄,用于不相交集合的合并与查询。Python实现包括初始化、查找根节点和合并操作。应用广泛,如社交网络分析、图论问题、集合划分等。示例代码展示了解决岛屿数量问题,统计连通的“1”单元格数。掌握并查集,提升编程效率,解决复杂问题。
22 6
|
1天前
|
存储 算法 搜索推荐
告别低效编程!Python算法设计与分析中,时间复杂度与空间复杂度的智慧抉择!
【7月更文挑战第22天】在编程中,时间复杂度和空间复杂度是评估算法效率的关键。时间复杂度衡量执行时间随数据量增加的趋势,空间复杂度关注算法所需的内存。在实际应用中,开发者需权衡两者,根据场景选择合适算法,如快速排序(平均O(n log n),最坏O(n^2),空间复杂度O(log n)至O(n))适合大规模数据,而归并排序(稳定O(n log n),空间复杂度O(n))在内存受限或稳定性要求高时更有利。通过优化,如改进基准选择或减少复制,可平衡这两者。理解并智慧地选择算法是提升代码效率的关键。
|
4天前
|
存储 开发者 Python
从理论到实践:Python中Trie树与Suffix Tree的完美结合,开启编程新篇章!
【7月更文挑战第19天】在编程实践中,Trie树和Suffix Tree优化了字符串处理。Trie树用于快速拼写检查,如在构建词库后,能高效判断单词是否存在。Suffix Tree则助力文本相似度检测,找寻共同子串。通过Python示例展示了Trie树插入和搜索方法,并指出Suffix Tree虽复杂但能提升性能。结合两者,实现复杂功能,展现数据结构的强大。
19 3
|
3天前
|
SQL 关系型数据库 数据库
优化Web开发流程:Python ORM的优势与实现细节
【7月更文挑战第20天】Python ORM,如Django ORM,提升Web开发效率,通过面向对象接口抽象数据库操作,简化SQL,增强代码可读性,并确保安全。Django中,定义Model对应数据库表,使用`makemigrations`和`migrate`创建表,实例化Model并调用`save()`保存数据,`objects.all()`和`filter()`查询数据,更新和删除数据涉及字段修改和调用`save()`或直接`delete()`。ORM提供数据库无关性,防止SQL注入,是现代Web开发的强大工具。
8 1
|
4天前
|
前端开发 数据库 开发者
构建可维护的Web应用:Python模板引擎与ORM的协同工作
【7月更文挑战第19天】在Web开发中,可维护性至关重要。Python搭配Flask或Django框架,利用模板引擎(如Jinja2)和ORM(如SQLAlchemy或Django ORM)增强开发效率和代码质量。模板引擎桥接前后端,ORM简化数据库操作,两者协同提升可读性和可测试性。例如,Flask用Jinja2渲染动态HTML,Django通过ORM处理数据库模型。这种分离关注点的方法降低了耦合,增强了应用的可维护性。
12 1
|
4天前
|
JSON 中间件 数据处理
实践出真知:通过项目学习Python Web框架的路由与中间件设计
【7月更文挑战第19天】探索Python Web开发,掌握Flask或Django的关键在于理解路由和中间件。路由连接URL与功能,如Flask中@app.route()定义请求响应路径。中间件在请求处理前后执行,提供扩展功能,如日志、认证。通过实践项目,不仅学习理论,还能提升构建高效Web应用的能力。示例代码展示路由定义及模拟中间件行为,强调动手实践的重要性。
|
1天前
|
JSON API 网络架构
颠覆传统!Python RESTful API设计与实现,让你的Web应用焕发新生!
【7月更文挑战第22天】了解RESTful API为何重要,它简化了Web服务接口并促进了前后端分离。Python开发者可选Flask或Django REST Framework来构建API。设计时注重资源导向、无状态和统一接口。以下是一个使用Flask创建图书管理API的简例,展示了如何通过HTTP方法处理资源操作。本文旨在帮助读者掌握Python RESTful API开发,鼓励创新与实践。
8 0