def post(self, url, data=None, json=None, **kwargs): return self.request(url, "POST", data, json, **kwargs)
时间: 2023-10-06 11:05:42 浏览: 43
这是一个 Python 的 requests 库中的方法,用于发送 POST 请求。它接受以下参数:
- url:请求的 URL。
- data:要发送的数据,可以是字符串、字典或元组列表等类型。
- json:要发送的 JSON 数据。
- **kwargs:其他可选参数,比如 headers、cookies 等。
该方法会调用 request 方法来发起请求,并指定请求方法为 POST。如果同时传递了 data 和 json 参数,则只有 json 参数会被发送。如果你不想使用 requests 库,也可以使用其他库来发送 POST 请求。
相关问题
给我一个python+pytest+allure 打造接口自动化pom框架
好的,下面是一个简单的 Python + Pytest + Allure 实现接口自动化 POM 框架的示例:
1. 安装依赖库
```
pip install requests
pip install pytest
pip install allure-pytest
```
2. 创建项目目录结构:
```
├── api
│ ├── __init__.py
│ ├── base_api.py
│ └── user_api.py
├── common
│ ├── __init__.py
│ ├── constants.py
│ ├── logger.py
│ └── utils.py
├── config
│ ├── __init__.py
│ └── config.py
├── data
│ ├── __init__.py
│ └── users.json
├── pytest.ini
├── README.md
├── requirements.txt
├── testcases
│ ├── __init__.py
│ ├── conftest.py
│ ├── test_login.py
│ └── test_user.py
└── pytest.ini
```
3. 编写配置文件 `config.py`、常量文件 `constants.py` 等。
`config.py`:
```python
class Config:
API_BASE_URL = 'https://xxx.com/api'
USERNAME = 'testuser'
PASSWORD = 'testpass'
```
`constants.py`:
```python
class StatusCode:
SUCCESS = 200
CLIENT_ERROR = 400
SERVER_ERROR = 500
```
4. 创建 HTTP 请求封装类 `base_api.py` 和业务接口类 `user_api.py`
`base_api.py`:
```python
import requests
from common.logger import logger
from common.constants import StatusCode
from config.config import Config
class BaseApi:
def __init__(self):
self.session = requests.session()
self.base_url = Config.API_BASE_URL
def request(self, method, url, **kwargs):
url = self.base_url + url
response = self.session.request(method, url, **kwargs)
logger.info(f'{method} {url} {kwargs} response: {response.json()}')
return response
def get(self, url, params=None, **kwargs):
return self.request('get', url, params=params, **kwargs)
def post(self, url, data=None, json=None, **kwargs):
return self.request('post', url, data=data, json=json, **kwargs)
def put(self, url, data=None, **kwargs):
return self.request('put', url, data=data, **kwargs)
def delete(self, url, **kwargs):
return self.request('delete', url, **kwargs)
def assert_status_code(self, response, expected_status_code):
assert response.status_code == expected_status_code, \
f'Expected status code is {expected_status_code}, but actual is {response.status_code}'
response_json = response.json()
assert response_json['code'] == StatusCode.SUCCESS, \
f'Response code is {response_json["code"]}, message is {response_json["message"]}'
```
`user_api.py`:
```python
from api.base_api import BaseApi
from common.constants import StatusCode
from config.config import Config
from common.utils import json_load
class UserApi(BaseApi):
def __init__(self):
super().__init__()
def login(self):
url = '/login'
data = {
'username': Config.USERNAME,
'password': Config.PASSWORD
}
response = self.post(url, json=data)
self.assert_status_code(response, StatusCode.SUCCESS)
return response.json()['data']['access_token']
def get_user_info(self, user_id):
url = f'/users/{user_id}'
headers = {
'Authorization': f'Bearer {self.login()}'
}
response = self.get(url, headers=headers)
self.assert_status_code(response, StatusCode.SUCCESS)
return response.json()['data']
def create_user(self, data):
url = '/users'
headers = {
'Authorization': f'Bearer {self.login()}'
}
response = self.post(url, json=data, headers=headers)
self.assert_status_code(response, StatusCode.SUCCESS)
return response.json()['data']
def delete_user(self, user_id):
url = f'/users/{user_id}'
headers = {
'Authorization': f'Bearer {self.login()}'
}
response = self.delete(url, headers=headers)
self.assert_status_code(response, StatusCode.SUCCESS)
return response.json()['data']
def get_random_user(self):
users = json_load('data/users.json')
return users[0]
```
5. 编写测试用例 `test_user.py` 和 `test_login.py`
`test_user.py`:
```python
import pytest
from api.user_api import UserApi
class TestUser:
@pytest.fixture(scope='class')
def user(self):
return UserApi().get_random_user()
def test_create_and_delete_user(self, user):
user_api = UserApi()
new_user = user_api.create_user(user)
assert new_user['username'] == user['username']
user_api.delete_user(new_user['id'])
def test_get_user_info(self):
user_api = UserApi()
user_info = user_api.get_user_info(1)
assert user_info['username'] == 'admin'
```
`test_login.py`:
```python
import pytest
from api.user_api import UserApi
class TestLogin:
def test_login(self):
user_api = UserApi()
access_token = user_api.login()
assert access_token is not None
```
6. 运行测试用例
在项目根目录下执行以下命令:
```
pytest --alluredir=./allure-results testcases/
```
7. 生成报告
在项目根目录下执行以下命令:
```
allure serve ./allure-results
```
此时会启动一个本地服务,打开浏览器输入 `http://localhost:port` 即可查看测试报告。
以上就是一个简单的 Python + Pytest + Allure 实现接口自动化 POM 框架的示例,希望对你有帮助。
Django的rest_framework的视图之基于ModelViewSet视图源码解析
好的,下面是基于Django的rest_framework框架的ModelViewSet视图的源码解析:
1.基本介绍
ModelViewSet视图是Django框架的rest_framework模块中的一个视图类,它继承了GenericAPIView和Mixins,提供了对资源的CRUD操作。ModelViewSet视图类中提供了一系列的方法,如list、create、retrieve、update、partial_update、destroy等,这些方法对应着HTTP请求中的GET、POST、PUT、PATCH、DELETE等动词。
2.源码解析
ModelViewSet视图的源码主要涉及到以下几个部分:
(1)视图类的定义
```
class ModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet):
"""
A viewset that provides default `create()`, `retrieve()`, `update()`,
`partial_update()`, `destroy()` and `list()` actions.
"""
pass
```
从源码可以看出,ModelViewSet继承了CreateModelMixin、RetrieveModelMixin、UpdateModelMixin、DestroyModelMixin和ListModelMixin这些视图混合类,以及GenericViewSet类。
(2)视图方法的实现
a. list方法
```
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
```
list方法用于返回资源列表,它首先通过get_queryset方法获取查询集,然后通过filter_queryset方法对查询集进行过滤,最后通过get_serializer方法将查询集序列化为JSON数据返回给客户端。
b. create方法
```
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
```
create方法用于创建资源,它首先通过get_serializer方法获取序列化器,然后通过perform_create方法进行资源的创建,最后返回HTTP 201 Created状态码以及资源的JSON数据。
c. retrieve方法
```
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance)
return Response(serializer.data)
```
retrieve方法用于获取单个资源,它通过get_object方法获取资源实例,然后通过get_serializer方法将资源实例序列化为JSON数据返回给客户端。
d. update方法
```
def update(self, request, *args, **kwargs):
partial = kwargs.pop('partial', False)
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
return Response(serializer.data)
```
update方法用于更新资源,它首先通过get_object方法获取资源实例,然后通过get_serializer方法获取序列化器,最后通过perform_update方法进行资源的更新,最终返回更新后的资源JSON数据。
e. partial_update方法
```
def partial_update(self, request, *args, **kwargs):
kwargs['partial'] = True
return self.update(request, *args, **kwargs)
```
partial_update方法用于部分更新资源,它通过调用update方法,并将partial参数设置为True,进行资源的部分更新。
f. destroy方法
```
def destroy(self, request, *args, **kwargs):
instance = self.get_object()
self.perform_destroy(instance)
return Response(status=status.HTTP_204_NO_CONTENT)
```
destroy方法用于删除资源,它首先通过get_object方法获取资源实例,然后通过perform_destroy方法进行资源的删除,最终返回HTTP 204 No Content状态码。
3.总结
ModelViewSet视图是Django框架的rest_framework模块中的一个视图类,它继承了GenericAPIView和Mixins,提供了对资源的CRUD操作。通过对视图类的源码解析,我们可以深入了解ModelViewSet视图的内部实现,从而更好地理解和使用该视图类。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)