mirror of
https://github.com/LCTT/TranslateProject.git
synced 2025-01-07 22:11:09 +08:00
158 lines
5.5 KiB
Markdown
158 lines
5.5 KiB
Markdown
[#]: collector: (lujun9972)
|
||
[#]: translator: (geekpi)
|
||
[#]: reviewer: ( )
|
||
[#]: publisher: ( )
|
||
[#]: url: ( )
|
||
[#]: subject: (How to write a Python web API with Pyramid and Cornice)
|
||
[#]: via: (https://opensource.com/article/20/1/python-web-api-pyramid-cornice)
|
||
[#]: author: (Moshe Zadka https://opensource.com/users/moshez)
|
||
|
||
How to write a Python web API with Pyramid and Cornice
|
||
======
|
||
Use Pyramid and Cornice to build and document scalable RESTful web
|
||
services.
|
||
![Searching for code][1]
|
||
|
||
[Python][2] is a high-level, object-oriented programming language known for its simple syntax. It is consistently among the top-rated programming languages for building RESTful APIs.
|
||
|
||
[Pyramid][3] is a Python web framework designed to scale up with an application: it's simple for simple applications but can grow for big, complex applications. Among other things, Pyramid powers PyPI, the Python package index. [Cornice][4] provides helpers to build and document REST-ish web services with Pyramid.
|
||
|
||
This article will use the example of a web service to get famous quotes to show how to use these tools.
|
||
|
||
### Set up a Pyramid application
|
||
|
||
Start by creating a virtual environment for your application and a file to hold the code:
|
||
|
||
|
||
```
|
||
$ mkdir tutorial
|
||
$ cd tutorial
|
||
$ touch main.py
|
||
$ python3 -m venv env
|
||
$ source env/bin/activate
|
||
(env) $ pip3 install cornice twisted
|
||
```
|
||
|
||
### Import the Cornice and Pyramid modules
|
||
|
||
Import these modules with:
|
||
|
||
|
||
```
|
||
from pyramid.config import Configurator
|
||
from cornice import Service
|
||
```
|
||
|
||
### Define the service
|
||
|
||
Define the quotes service as a **Service** object:
|
||
|
||
|
||
```
|
||
QUOTES = Service(name='quotes',
|
||
path='/',
|
||
description='Get quotes')
|
||
```
|
||
|
||
### Write the quotes logic
|
||
|
||
So far, this only supports **GET**ing quotes. Decorate the function with **QUOTES.get**; this is how you can tie in the logic to the REST service:
|
||
|
||
|
||
```
|
||
@QUOTES.get()
|
||
def get_quote(request):
|
||
return {
|
||
'William Shakespeare': {
|
||
'quote': ['Love all, trust a few, do wrong to none',
|
||
'Some are born great, some achieve greatness, and some have greatness thrust upon them.']
|
||
},
|
||
'Linus': {
|
||
'quote': ['Talk is cheap. Show me the code.']
|
||
}
|
||
}
|
||
```
|
||
|
||
Note that unlike in other frameworks, the **get_quote** function is _not_ changed by the decorator. If you import this module, you can still call the function regularly and inspect the result.
|
||
|
||
This is useful when writing unit tests for Pyramid RESTful services.
|
||
|
||
### Define the application object
|
||
|
||
Finally, use **scan** to find all decorated functions and add them to the configuration:
|
||
|
||
|
||
```
|
||
with Configurator() as config:
|
||
config.include("cornice")
|
||
config.scan()
|
||
application = config.make_wsgi_app()
|
||
```
|
||
|
||
The default for scan is to scan the current module. You can also give the name of a package if you want to scan all modules in a package.
|
||
|
||
### Run the service
|
||
|
||
I use Twisted's WSGI server to run the application, but you can use any other [WSGI][5] server, like Gunicorn or uWSGI, if you want:
|
||
|
||
|
||
```
|
||
`(env)$ python -m twisted web --wsgi=main.application`
|
||
```
|
||
|
||
By default, Twisted's WSGI server runs on port 8080. You can test the service with [HTTPie][6]:
|
||
|
||
|
||
```
|
||
(env) $ pip install httpie
|
||
...
|
||
(env) $ http GET <http://localhost:8080/>
|
||
HTTP/1.1 200 OK
|
||
Content-Length: 220
|
||
Content-Type: application/json
|
||
Date: Mon, 02 Dec 2019 16:49:27 GMT
|
||
Server: TwistedWeb/19.10.0
|
||
X-Content-Type-Options: nosniff
|
||
|
||
{
|
||
"Linus": {
|
||
"quote": [
|
||
"Talk is cheap. Show me the code."
|
||
]
|
||
},
|
||
"William Shakespeare": {
|
||
"quote": [
|
||
"Love all,trust a few,do wrong to none",
|
||
"Some are born great, some achieve greatness, and some greatness thrust upon them."
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
### Why use Pyramid?
|
||
|
||
Pyramid is not the most popular framework, but it is used in some high-profile projects like [PyPI][7]. I like Pyramid because it is one of the frameworks that took unit testing seriously: because the decorators do not modify the function and there are no thread-local variables, functions are callable directly from unit tests. For example, functions that need access to the database will get it from the **request** object passed in via **request.config**. This allows a unit tester to put a mock (or real) database object in the request, instead of carefully setting globals, thread-local variables, or other framework-specific things.
|
||
|
||
If you're looking for a well-tested library to build your next API, give Pyramid a try. You won't be disappointed.
|
||
|
||
--------------------------------------------------------------------------------
|
||
|
||
via: https://opensource.com/article/20/1/python-web-api-pyramid-cornice
|
||
|
||
作者:[Moshe Zadka][a]
|
||
选题:[lujun9972][b]
|
||
译者:[译者ID](https://github.com/译者ID)
|
||
校对:[校对者ID](https://github.com/校对者ID)
|
||
|
||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||
|
||
[a]: https://opensource.com/users/moshez
|
||
[b]: https://github.com/lujun9972
|
||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/search_find_code_python_programming.png?itok=ynSL8XRV (Searching for code)
|
||
[2]: https://opensource.com/resources/python
|
||
[3]: https://opensource.com/article/18/5/pyramid-framework
|
||
[4]: https://cornice.readthedocs.io/en/latest/
|
||
[5]: https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface
|
||
[6]: https://opensource.com/article/19/8/getting-started-httpie
|
||
[7]: https://pypi.org/
|