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 协议的模块。
  1. http.client 是一个底层的 HTTP 协议客户端,被更高层的 urllib.request 模块所使用。
  2. http.server 包含基于 socketserver 的基本 HTTP 服务器的类。
  3. http.cookies 实现 cookie 状态管理
  4. http.cookiejar 与 cookie 相关
  • http.client 模块定义了实现 http 和 https 协议客户端的类。 该模块通常不会直接使用,而是用封装好的 urllib.request 模块来处理 URL 。
  • HTTPConnection 类
    http.client.HTTPConnection(host, port=None, [timeout, ]source_address=NoneHTTPConnection 实例表示与 HTTP 服务器的事务。
  • HTTPResponse 类
    class http.client.HTTPResponse(sock, debuglevel=0, method=None, url=None)一旦连接成功就会返回该实例,该类的对象不能由用户直接实例化。
  • 异常类 HTTPException 类
    Exception 类的子类,也是 http 模块中其他异常类的基类。
  • HTTPConnection 对象方法
    HTTPConnection 实例有如下的方法 :
  1. HTTPConnection.request(method, url, body=None, headers={}) 使用指定的 method 方法和 url 链接向服务器发送请求。
    如果指定 了body 部分,那么 body 部分将在 header 部分发送完之后发送过去。body 部分可以是一个字符串、字节对象、文件对象或者是字节对象的迭代器。不同的 body 类型对应不同的要求。
    header 参数应该是 HTTP 头部的映射,是一个字典类型。
    如果 header 中不包含 Content-Length 项,那么会根据 body 的不同来自动添加上去。
  2. HTTPConnection.getresponse() 必须在请求发送后才能调用得到服务器返回的内容,返回的是一个 HTTPResponse 实例。
  3. 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

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()函数无关