×

编码方式 python py

python有哪几种编码方式?如何使用python 开发一个api

admin admin 发表于2022-04-28 09:08:28 浏览146 评论0

抢沙发发表评论

python有哪几种编码方式

第一种:ASCII码。是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,它是现今最通用的单字节编码系统,并等同于国际标准IS/IEC 646。由于计算机是美国人发明的,因此,最早只有127个字母被编码到计算机李,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母a的编码是97,后128个称为扩展ASCII码。第二种:GBK和GB2312。能在计算机中显示中文字符是至关重要的,然而ASCII表里一个偏旁部首都没有,所以我们需要一个关于中文和数字对应的关系表,一个字节只能最多表示256个字符,用处理中文显然一个字节是不够的,所以我们需要采用两个字节来表示,所以中国制定了GB2312编码,用来将中文编写进去。第三种:Unicode。因为各个国家都有一套自己的编码,所以无法避免冲突,因此Unicode诞生了。它可以把所有语言都统一到一套编码里,这样就不会存在乱码问题了,现代操作系统和大多数编程语言都直接支持Unicode。第四种:UFT-8。基于节约的原则,出现了把Unicode编码转化为可变长编码的UTF-8编码。而UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成一个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节,如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间。

如何使用python 开发一个api

使用 Python 和 Flask 设计 RESTful API

近些年来 REST (REpresentational State Transfer) 已经变成了 web services 和 web APIs 的标配。

在本文中我将向你展示如何简单地使用 Python 和 Flask 框架来创建一个 RESTful 的 web service。

什么是 REST?

六条设计规范定义了一个 REST 系统的特点:

  • 客户端-服务器: 客户端和服务器之间隔离,服务器提供服务,客户端进行消费。

  • 无状态: 从客户端到服务器的每个请求都必须包含理解请求所必需的信息。换句话说, 服务器不会存储客户端上一次请求的信息用来给下一次使用。

  • 可缓存: 服务器必须明示客户端请求能否缓存。

  • 分层系统: 客户端和服务器之间的通信应该以一种标准的方式,就是中间层代替服务器做出响应的时候,客户端不需要做任何变动。

  • 统一的接口: 服务器和客户端的通信方法必须是统一的。

  • 按需编码: 服务器可以提供可执行代码或脚本,为客户端在它们的环境中执行。这个约束是唯一一个是可选的。

  • 什么是一个 RESTful 的 web service?

    REST 架构的最初目的是适应万维网的 HTTP 协议。

    RESTful web services 概念的核心就是“资源”。 资源可以用 URI 来表示。客户端使用 HTTP 协议定义的方法来发送请求到这些 URIs,当然可能会导致这些被访问的”资源“状态的改变。-py

    HTTP 标准的方法有如下:

  • ==========  =====================  ==================================
  • HTTP 方法   行为                   示例
  • ==========  =====================  ==================================
  • GET         获取资源的信息        
  • GET         获取某个特定资源的信息
  • POST        创建新资源            
  • PUT         更新资源              
  • DELETE      删除资源              
  • ==========  ====================== ==================================
  • REST 设计不需要特定的数据格式。在请求中数据可以以 JSON 形式, 或者有时候作为 url 中查询参数项。

    设计一个简单的 web service

    坚持 REST 的准则设计一个 web service 或者 API 的任务就变成一个标识资源被展示出来以及它们是怎样受不同的请求方法影响的练习。

    比如说,我们要编写一个待办事项应用程序而且我们想要为它设计一个 web service。要做的第一件事情就是决定用什么样的根 URL 来访问该服务。例如,我们可以通过这个来访问:

    我们的任务资源将要使用 HTTP 方法如下:

  • ==========  ===============================================  =============================
  • HTTP 方法   URL                                              动作
  • ==========  ===============================================  ==============================
  • GET        
  • GET        
  • POST        
  • PUT        
  • DELETE      
  • ==========  ================================================ =============================
  • 我们定义的任务有如下一些属性:

  • id: 任务的唯一标识符。数字类型。

  • title: 简短的任务描述。字符串类型。

  • description: 具体的任务描述。文本类型。

  • done: 任务完成的状态。布尔值。

  • 目前为止关于我们的 web service 的设计基本完成。剩下的事情就是实现它!

    Flask 框架的简介

    如果你读过 Flask Mega-Tutorial 系列,就会知道 Flask 是一个简单却十分强大的 Python web 框架。

    在我们深入研究 web services 的细节之前,让我们回顾一下一个普通的 Flask Web 应用程序的结构。

    我会首先假设你知道 Python 在你的平台上工作的基本知识。 我将讲解的例子是工作在一个类 Unix 操作系统。简而言之,这意味着它们能工作在 Linux,Mac OS X 和 Windows(如果你使用Cygwin)。 如果你使用 Windows 上原生的 Python 版本的话,命令会有所不同。-python

    让我们开始在一个虚拟环境上安装 Flask。如果你的系统上没有 virtualenv,你可以从

  • $ cd todo-api
  • $ virtualenv flask
  • New python executable in flask/bin/python
  • Installing setuptools............................done.
  • Installing pip...................done.
  • $ flask/bin/pip install flask
  • 既然已经安装了 Flask,现在开始创建一个简单地网页应用,我们把它放在一个叫 app.py 的文件中:-py

  • #!flask/bin/pythonfrom flask import Flaskapp = Flask(__name__)@app.route(’/’)def index():
  •    return “Hello, World!“if __name__ == ’__main__’:
  •    app.run(debug=True)
  • 为了运行这个程序我们必须执行 app.py:

  • $ chmod a+x app.py
  • $ ./app.py
  • * Running on
  • * Restarting with reloader
  • 现在你可以启动你的网页浏览器,输入 

    我们现在来实现 web service 的第一个入口:

  • #!flask/bin/pythonfrom flask import Flask, jsonifyapp = Flask(__name__)tasks = [
  •    {
  •        ’id’: 1,
  •        ’title’: u’Buy groceries’,
  •        ’description’: u’Milk, Cheese, Pizza, Fruit, Tylenol’,
  •        ’done’: False
  •    },
  •    {
  •        ’id’: 2,
  •        ’title’: u’Learn Python’,
  •        ’description’: u’Need to find a good Python tutorial on the web’,
  •        ’done’: False
  •    }]@app.route(’/todo/api/v1.0/tasks’, methods=[’GET’])def get_tasks():
  •    return jsonify({’tasks’: tasks})if __name__ == ’__main__’:
  •    app.run(debug=True)
  • 正如你所见,没有多大的变化。我们创建一个任务的内存数据库,这里无非就是一个字典和数组。数组中的每一个元素都具有上述定义的任务的属性。

    取代了首页,我们现在拥有一个 get_tasks 的函数,访问的 URI 为 /todo/api/v1.0/tasks,并且只允许 GET 的 HTTP 方法。

    这个函数的响应不是文本,我们使用 JSON 数据格式来响应,Flask 的 jsonify 函数从我们的数据结构中生成。

    使用网页浏览器来测试我们的 web service 不是一个最好的注意,因为网页浏览器上不能轻易地模拟所有的 HTTP 请求的方法。相反,我们会使用 curl。如果你还没有安装 curl 的话,请立即安装它。-python

    通过执行 app.py,启动 web service。接着打开一个新的控制台窗口,运行以下命令:

  • $ curl -i
  • HTTP/1.0 200 OK
  • Content-Type: application/json
  • Content-Length: 294
  • Server: Werkzeug/0.8.3 Python/2.7.3
  • Date: Mon, 20 May 2013 04:53:53 GMT
  • {
  •  “tasks“: [
  •    {
  •      “description“: “Milk, Cheese, Pizza, Fruit, Tylenol“,
  •      “done“: false,
  •      “id“: 1,
  •      “title“: “Buy groceries“
  •    },
  •    {
  •      “description“: “Need to find a good Python tutorial on the web“,
  •      “done“: false,
  •      “id“: 2,
  •      “title“: “Learn Python“
  •    }
  •  ]
  • }
  • 我们已经成功地调用我们的 RESTful service 的一个函数!

    现在我们开始编写 GET 方法请求我们的任务资源的第二个版本。这是一个用来返回单独一个任务的函数:

  • from flask import abort@app.route(’/todo/api/v1.0/tasks/《int:task_id》’, methods=[’GET’])def get_task(task_id):
  •    task = filter(lambda t: t[’id’] == task_id, tasks)
  •    if len(task) == 0:
  •        abort(404)
  •    return jsonify({’task’: task})
  • 第二个函数有些意思。这里我们得到了 URL 中任务的 id,接着 Flask 把它转换成 函数中的 task_id 的参数。

    我们用这个参数来搜索我们的任务数组。如果我们的数据库中不存在搜索的 id,我们将会返回一个类似 404 的错误,根据 HTTP 规范的意思是 “资源未找到”。

    如果我们找到相应的任务,那么我们只需将它用 jsonify 打包成 JSON 格式并将其发送作为响应,就像我们以前那样处理整个任务集合。

    调用 curl 请求的结果如下:

  • $ curl -i
  • HTTP/1.0 200 OK
  • Content-Type: application/json
  • Content-Length: 151
  • Server: Werkzeug/0.8.3 Python/2.7.3
  • Date: Mon, 20 May 2013 05:21:50 GMT
  • {
  •  “task“: {
  •    “description“: “Need to find a good Python tutorial on the web“,
  •    “done“: false,
  •    “id“: 2,
  •    “title“: “Learn Python“
  •  }
  • }
  • $ curl -i
  • HTTP/1.0 404 NOT FOUND
  • Content-Type: text/html
  • Content-Length: 238
  • Server: Werkzeug/0.8.3 Python/2.7.3
  • Date: Mon, 20 May 2013 05:21:52 GMT
  • 《!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 3.2 Final//EN“》
  • 《title》404 Not Found《/title》
  • 《h1》Not Found《/h1》
  • 《p》The requested URL was not found on the server.《/p》《p》If you     entered the URL manually please check your spelling and try again.《/p》
  • 当我们请求 id #2 的资源时候,我们获取到了,但是当我们请求 #3 的时候返回了 404 错误。有关错误奇怪的是返回的是 HTML 信息而不是 JSON,这是因为 Flask 按照默认方式生成 404 响应。由于这是一个 Web service 客户端希望我们总是以 JSON 格式回应,所以我们需要改善我们的 404 错误处理程序:-py

  • from flask import make_response@app.errorhandler(404)def not_found(error):
  •    return make_response(jsonify({’error’: ’Not found’}), 404)
  • 我们会得到一个友好的错误提示:

  • $ curl -i
  • HTTP/1.0 404 NOT FOUND
  • Content-Type: application/json
  • Content-Length: 26
  • Server: Werkzeug/0.8.3 Python/2.7.3
  • Date: Mon, 20 May 2013 05:36:54 GMT
  • {
  •  “error“: “Not found“
  • }
  • 接下来就是 POST 方法,我们用来在我们的任务数据库中插入一个新的任务:

  • from flask import request@app.route(’/todo/api/v1.0/tasks’, methods=[’POST’])def create_task():
  •    if not request.json or not ’title’ in request.json:
  •        abort(400)
  •    task = {
  •        ’id’: tasks[’id’] + 1,
  •        ’title’: request.json[’title’],
  •        ’description’: request.json.get(’description’, ““),
  •        ’done’: False
  •    }
  •    tasks.append(task)
  •    return jsonify({’task’: task}), 201
  • 添加一个新的任务也是相当容易地。只有当请求以 JSON 格式形式,request.json 才会有请求的数据。如果没有数据,或者存在数据但是缺少 title 项,我们将会返回 400,这是表示请求无效。-python

    接着我们会创建一个新的任务字典,使用最后一个任务的 id + 1 作为该任务的 id。我们允许 description 字段缺失,并且假设 done 字段设置成 False。

    我们把新的任务添加到我们的任务数组中,并且把新添加的任务和状态 201 响应给客户端。

    使用如下的 curl 命令来测试这个新的函数:

  • $ curl -i -H “Content-Type: application/json“ -X POST -d ’{“title“:“Read a book“}’
  • HTTP/1.0 201 Created
  • Content-Type: application/json
  • Content-Length: 104
  • Server: Werkzeug/0.8.3 Python/2.7.3
  • Date: Mon, 20 May 2013 05:56:21 GMT
  • {
  •  “task“: {
  •    “description“: ““,
  •    “done“: false,
  •    “id“: 3,
  •    “title“: “Read a book“
  •  }
  • }
  • 注意:如果你在 Windows 上并且运行 Cygwin 版本的 curl,上面的命令不会有任何问题。然而,如果你使用原生的 curl,命令会有些不同:

  • curl -i -H “Content-Type: application/json“ -X POST -d “{“““title“““:“““Read a book“““}“

    当然在完成这个请求后,我们可以得到任务的更新列表:

  • $ curl -i
  • HTTP/1.0 200 OK
  • Content-Type: application/json
  • Content-Length: 423
  • Server: Werkzeug/0.8.3 Python/2.7.3
  • Date: Mon, 20 May 2013 05:57:44 GMT
  • {
  •  “tasks“: [
  •    {
  •      “description“: “Milk, Cheese, Pizza, Fruit, Tylenol“,
  •      “done“: false,
  •      “id“: 1,
  •      “title“: “Buy groceries“
  •    },
  •    {
  •      “description“: “Need to find a good Python tutorial on the web“,
  •      “done“: false,
  •      “id“: 2,
  •      “title“: “Learn Python“
  •    },
  •    {
  •      “description“: ““,
  •      “done“: false,
  •      “id“: 3,
  •      “title“: “Read a book“
  •    }
  •  ]
  • }
  • 剩下的两个函数如下所示:

  • @app.route(’/todo/api/v1.0/tasks/《int:task_id》’, methods=[’PUT’])def update_task(task_id):
  •    task = filter(lambda t: t[’id’] == task_id, tasks)
  •    if len(task) == 0:
  •        abort(404)
  •    if not request.json:
  •        abort(400)
  •    if ’title’ in request.json and type(request.json[’title’]) != unicode:
  •        abort(400)
  •    if ’description’ in request.json and type(request.json[’description’]) is not unicode:
  •        abort(400)

python中怎样将unicode转换成原来的中文

python默认就是unicode存储。如果是从文件读取的,在open的参数中指定encoding关键字参数就行。如下:

#coding=utf-8/import json /def LoadQuestion():  /f = open(“test.json“,’r’)  qas = json.load(f)  question = qas[’documents’] /return question/t = LoadQuestion() /print str(t).decode(“unicode-escape“)     -py

拓展资料:

通常python2时所有IO读写都是byte方式。也就是编码后的。java也是这样子。只有python3还有某些特定的模块才会自动将byte重新转换成unicode在python2里的确可以使用s.decode(’gbk’,’ignore’)之类的变成unicode。不过在python3里应该是这样子, s.encode(’gbk’,’ignore’)这样就变成了byte如果你喜欢 utf-8,可以s.encode(‘utf-8’,’ignore’)和s.decode(‘utf-8’,’ignore’)-python