python一小段代码单句解析
- # -*- coding:utf-8 -*-
- import http.client
- import hashlib
- import urllib.parse
- import random
- from flask import Flask
- appKey = '2019c018c4d451ac'
- secretKey = 'dPxFD2pQ7DbHblJlTVlUvGiQUtbVX8f0'
- httpClient = None
- myurl = '/api'
- fromLang = 'zh-CHS'
- toLang = 'EN'
- salt = random.randint(1, 65536)
- sign = appKey + q + str(salt) + secretKey
- m1 = hashlib.md5()
- m1.update(sign.encode("utf8"))
- sign = m1.hexdigest()
- myurl = myurl + '?appKey=' + appKey + '&q=' + urllib.parse.quote(q) + '&from=' + fromLang + '&to=' + toLang + '&salt=' + str(salt) + '&sign=' + sign
- except Exception as e:
- httpClient.close()
- app = Flask(__name__)
- if __name__ == '__main__':app.run()
# -*- coding:utf-8 -*-
import http.client
import hashlib
import urllib.parse
import random
from flask import Flask
def trans(q):
# coding=utf8
appKey = '2019c018c4d451ac'
secretKey = 'dPxFD2pQ7DbHblJlTVlUvGiQUtbVX8f0'
httpClient = None
myurl = '/api'
fromLang = 'zh-CHS'
toLang = 'EN'
salt = random.randint(1, 65536)
sign = appKey + q + str(salt) + secretKey
m1 = hashlib.md5()
m1.update(sign.encode("utf8"))
sign = m1.hexdigest()
myurl = myurl + '?appKey=' + appKey + '&q=' + urllib.parse.quote(
q) + '&from=' + fromLang + '&to=' + toLang + '&salt=' + str(salt) + '&sign=' + sign
try:
httpClient = http.client.HTTPConnection('openapi.youdao.com')
httpClient.request('GET', myurl)
# response是HTTPResponse对象
response = httpClient.getresponse()
s = "translation"
en = "errorCode"
s0 = response.read().decode()
n = s0.find(s)
nen = s0.find(en)
return (s0[(n+13):(nen - 2)])
except Exception as e:
return e
finally:
if httpClient:
httpClient.close()
app = Flask(__name__)
@app.route('/API')
def main():
q = '每一个人都有自己的理想,我的理想是当一名治病救人、救死扶伤的医生。当我看到那些患病的人在忍受着痛苦地煎熬,非常心痛!我想当一名医生,为他们减轻痛苦,医好他们的身体,使他们能健康地、快乐地和亲人们生活在一起。当下我必须好好学习,将来考入一所优秀的医科大学,用先进的医术和温暖的笑容去帮助每一个人,成为白求恩那样的白衣天使,那时才能真正实现我的理想。'
return trans(q)
if __name__ == '__main__':
app.run()
此段代码的功能是运用 flask 搭建简易服务器,调用有道翻译提供的API,对一段文本进行翻译过后在http://localhost:5000/API
输出翻译结果。
# -- coding:utf-8 --
在pycharm中编写代码用到中文(注释中的中文也算)时,如果使用的python版本是python2,在运行程序的时候就会报错,这时候输入这行代码,把文件的编码格式改成utf-8,就可以使用中文了。
注意: python3默认支持中文,但是为了程序的可移植性,建议仍加上
import http.client
- http 模块简介
Python3 中的 http 包中含有几个用来开发 HTTP 协议的模块。
- http.client 是一个底层的 HTTP 协议客户端,被更高层的 urllib.request 模块所使用。
- http.server 包含基于 socketserver 的基本 HTTP 服务器的类。
- http.cookies 实现 cookie 状态管理
- http.cookiejar 与 cookie 相关
- http.client 模块定义了实现 http 和 https 协议客户端的类。 该模块通常不会直接使用,而是用封装好的 urllib.request 模块来处理 URL 。
- HTTPConnection 类
http.client.HTTPConnection(host, port=None, [timeout, ]source_address=None
HTTPConnection 实例表示与 HTTP 服务器的事务。 - HTTPResponse 类
class http.client.HTTPResponse(sock, debuglevel=0, method=None, url=None)
一旦连接成功就会返回该实例,该类的对象不能由用户直接实例化。 - 异常类 HTTPException 类
Exception 类的子类,也是 http 模块中其他异常类的基类。 - HTTPConnection 对象方法
HTTPConnection 实例有如下的方法 :
-
HTTPConnection.request(method, url, body=None, headers={})
使用指定的 method 方法和 url 链接向服务器发送请求。
如果指定 了body 部分,那么 body 部分将在 header 部分发送完之后发送过去。body 部分可以是一个字符串、字节对象、文件对象或者是字节对象的迭代器。不同的 body 类型对应不同的要求。
header 参数应该是 HTTP 头部的映射,是一个字典类型。
如果 header 中不包含 Content-Length 项,那么会根据 body 的不同来自动添加上去。 -
HTTPConnection.getresponse()
必须在请求发送后才能调用得到服务器返回的内容,返回的是一个 HTTPResponse 实例。 -
HTTPConnection.close()
关闭链接。
- HTTPResponse 对象方法
HTTPResponse 实例包含了从服务器返回的 HTTP 回应。
它提供了访问请求头部和 body 部分的方法。
HTTPResponse 是一个可迭代的对象而且可以使用 with 语句来声明。
HTTPResponse 实例有如下的方法 :HTTPResponse.read([amt])
读取和返回 response 的 body 部分。
(其实还有很多方法,本文只讲以上代码中用到的)
import hashlib
python中的hashlib模块用来进行hash或者md5加密,而且这种加密是不可逆的,所以这种算法又被称为摘要算法。
加盐:这里的“盐”有点类似于给密码信息加点调料,提高密码的安全性,只要’Salt’部分不被泄露,就没办法反推用户的简单密码。
-
hashlib.md5()
方法创建一个md5加密模式的hash对象 -
update(arg)
:用字符串参数来更新hash对象,如果同一个has对象重复调用该方法,如下:m.update(a); m.update(b),则等于m.update(a+b) -
hexdigest()
:返回摘要,作为十六进制数据字符串值 - 示例:
import hashlib
m = hashlib.md5()
m.update('how to use md5'.encode('utf-8'))
m.update('in python hashlib'.encode('utf-8'))
print m.hexdigest()
import urllib.parse
简单的说就是可以拆分URL,也可以拼接URL。
- 按照标准,URL只允许一部分ASCII字符,其他字符(如汉字)是不符合标准的,此时就要进行编码。用
urllib.parse.quote(q)
方法
import random
salt = random.randint(1, 65536)
print( random.randint(1,10) ) # 产生 1 到 10 的一个整数型随机数
print( random.random() ) # 产生 0 到 1 之间的随机浮点数
print( random.uniform(1.1,5.4) ) # 产生 1.1 到 5.4 之间的随机浮点数,区间可以不是整数
print( random.choice('tomorrow') ) # 从序列中随机选取一个元素
print( random.randrange(1,100,2) ) # 生成从1到100的间隔为2的随机整数
其中 randint、uniform、choice的区间是全闭的,random、randrange的区间是左闭右开的。
from flask import Flask
- 引入Flask类,Flask类实现了一个WSGI应用
- python-Flask框架说明文档
appKey = ‘2019c018c4d451ac’
- 在有道智云申请的API-Key
secretKey = ‘dPxFD2pQ7DbHblJlTVlUvGiQUtbVX8f0’
- 在有道智云申请的secretKey 密钥
httpClient = None
此处不懂,没有找到答案,有知道的网友可以评论告知一下吗
myurl = ‘/api’
fromLang = ‘zh-CHS’
toLang = ‘EN’
- 以上三条均为API说明文档中规定url的一部分
salt = random.randint(1, 65536)
- 产生 [1,65536] 的一个整数型随机数
sign = appKey + q + str(salt) + secretKey
- 将作为加密参数对密钥加密
m1 = hashlib.md5()
- 创建一个md5加密模式的hash对象 m1
m1.update(sign.encode(“utf8”))
- 用
sign.encode("utf8")
来更新hash对象
sign = m1.hexdigest()
- 返回摘要,作为十六进制数据字符串值
myurl = myurl + ‘?appKey=’ + appKey + ‘&q=’ + urllib.parse.quote(q) + ‘&from=’ + fromLang + ‘&to=’ + toLang + ‘&salt=’ + str(salt) + ‘&sign=’ + sign
- 作为参数传入API网站
httpClient = http.client.HTTPConnection('openapi.youdao.com')
httpClient.request('GET', myurl)
# response是HTTPResponse对象
response = httpClient.getresponse()
以“get”方法连接到url
s = "translation"
en = "errorCode"
s0 = response.read().decode() //读取返回值
n = s0.find(s) //python字符串方法,找到字符串中,子字符串第一次出现的下标值
nen = s0.find(en)
except Exception as e:
- 处理异常
httpClient.close()
- 关闭连接
app = Flask(name)
- app是Flask的实例,它接收包或者模块的名字作为参数,但一般都是传递__name__。
- 让flask.helpers.get_root_path函数通过传入这个名字确定程序的根目录,以便获得静态文件和模板文件的目录。
@app.route('/API')
def main():
q = '每一个人都有自己的理想,我的理想是当一名治病救人、救死扶伤的医生。当我看到那些患病的人在忍受着痛苦地煎熬,非常心痛!我想当一名医生,为他们减轻痛苦,医好他们的身体,使他们能健康地、快乐地和亲人们生活在一起。当下我必须好好学习,将来考入一所优秀的医科大学,用先进的医术和温暖的笑容去帮助每一个人,成为白求恩那样的白衣天使,那时才能真正实现我的理想。'
return trans(q)
- 使用app.route装饰器会将URL和执行的视图函数的关系保存到app.url_map属性上。
处理URL和视图函数的关系的程序就是路由,这里的视图函数就是main()。
if name == ‘main’:app.run()
- 使用这个判断可以保证当其他文件引用这个文件的时候(例如“from hello import app”)不会执行这个判断内的代码,也就是不会执行app.run函数。
- 此处mian与上文main()函数无关