我正在尝试使用 CI/CD gitlab 设置 django 项目的自动测试。问题是,我无法以任何方式连接到 Mysql 数据库。
gitlab-ci.yml
services:
- mysql:5.7
variables:
MYSQL_DATABASE: "db_name"
MYSQL_ROOT_PASSWORD: "dbpass"
MYSQL_USER: "username"
MYSQL_PASSWORD: "dbpass"
stages:
- test
test:
stage: test
before_script:
- apt update -qy && apt-get install -qqy --no-install-recommends default-mysql-client
- mysql --user=$MYSQL_USER --password=$MYSQL_PASSWORD --database=$MYSQL_DATABASE --host=$MYSQL_HOST --execute="SHOW DATABASES; ALTER USER '$MYSQL_USER'@'%' IDENTIFIED WITH mysql_native_password BY '$MYSQL_PASSWORD'"
script:
- apt update -qy
- apt install python3 python3-pip virtualenvwrapper -qy
- virtualenv --python=python3 venv/
- source venv/bin/activate
- pwd
- pip install -r requirement.txt …Run Code Online (Sandbox Code Playgroud) 返回 RedirectResponse 对象后,我遇到了奇怪的重定向行为
事件.py
router = APIRouter()
@router.post('/create', response_model=EventBase)
async def event_create(
request: Request,
user_id: str = Depends(get_current_user),
service: EventsService = Depends(),
form: EventForm = Depends(EventForm.as_form)
):
event = await service.post(
...
)
redirect_url = request.url_for('get_event', **{'pk': event['id']})
return RedirectResponse(redirect_url)
@router.get('/{pk}', response_model=EventSingle)
async def get_event(
request: Request,
pk: int,
service: EventsService = Depends()
):
....some logic....
return templates.TemplateResponse(
'event.html',
context=
{
...
}
)
Run Code Online (Sandbox Code Playgroud)
路由器.py
api_router = APIRouter()
...
api_router.include_router(events.router, prefix="/event")
Run Code Online (Sandbox Code Playgroud)
这段代码返回结果
127.0.0.1:37772 - "POST /event/22 HTTP/1.1" 405 Method Not …Run Code Online (Sandbox Code Playgroud) 我试图找到一种适用于表单的方法,但这里的类不适用
class TrainerFilter(django_filters.FilterSet):
price_lt = django_filters.NumberFilter(field_name="prise", lookup_expr='lt')
class Meta:
model = Profile
fields = ['direction', 'group', 'child', 'price_lt']
widgets = {
'direction': SelectMultiple(attrs={'class': 'custom-select'}),
}
Run Code Online (Sandbox Code Playgroud) 我创建了一个 lambda 函数来将文件上传到 s3。通过 AWS 界面进行测试时,一切正常。接下来我创建了 API Gateway 并尝试通过 ReactJs 发出请求。但我得到一个错误。我想查看发生了什么错误,但我无法向 API 网关添加日志。我所做的。
尝试激活复选框启用 CloudWatch Logs 但得到 CloudWatch Logs role ARN must be set in account settings to enable logging
使用下一个策略在 IAM 中创建角色:AmazonS3FullAccess、AmazonAPIGatewayPushToCloudWatchLogs、AWSLambdaBasicExecutionRole
复制角色 ARN
The role ARN does not have required permissions set to API Gateway。你能告诉我我需要什么其他设置吗?
如果我需要在保存到数据库之前更改一些字段值,因为我认为模型方法clear()是合适的。但尽管我竭尽全力,还是无法给他打电话。
例如,我需要将字段email设置为小写,将字段nda设置为null
模型.py
class Vendors(models.Model):
nda = models.DateField(blank=True, null=True)
parent = models.OneToOneField('Vendors', models.DO_NOTHING, blank=True, null=True)
def clean(self):
if self.nda == "":
self.nda = None
class VendorContacts(models.Model):
....
vendor = models.ForeignKey('Vendors', related_name='contacts', on_delete=models.CASCADE)
email = models.CharField(max_length=80, blank=True, null=True, unique=True)
def clean(self):
if self.email:
self.email = self.email.lower()
Run Code Online (Sandbox Code Playgroud)
序列化器.py
class VendorContactSerializer(serializers.ModelSerializer):
class Meta:
model = VendorContacts
fields = (
...
'email',)
class VendorsSerializer(serializers.ModelSerializer):
contacts = VendorContactSerializer(many=True)
class Meta:
model = Vendors
fields = (...
'nda', …Run Code Online (Sandbox Code Playgroud) 我有一个简单的文件模型
class Documents(models.Model):
""" uploaded documents"""
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
upload = models.FileField(storage=PrivateMediaStorage())
filename = models.CharField(_('documents name'), max_length=255, blank=True, null=True)
datafile = models.FileField()
created = models.DateTimeField(auto_now_add=True)
type = models.ForeignKey(Doctype, on_delete=models.CASCADE, blank=True)
Run Code Online (Sandbox Code Playgroud)
要显示上传的文档列表并添加新文件,我使用了类
class DocumentsListView(viewsets.ViewSetMixin,generics.ListCreateAPIView):
queryset = Documents.objects.all()
serializer_class = DocumentsSerializer
def perform_create(self, serializer):
serializer.save(author=self.request.user)
Run Code Online (Sandbox Code Playgroud)
序列化程序.py
class DocumentsSerializer(AwsUrlMixin, serializers.ModelSerializer):
type_name = serializers.CharField(source='type.type', read_only=True)
type = serializers.PrimaryKeyRelatedField(queryset=Doctype.objects.all())
view_file = serializers.SerializerMethodField()
author = serializers.CharField(source='author.username', read_only=True)
created = serializers.DateTimeField(format=date_format, input_formats=None, default_timezone=None, read_only=True)
class Meta:
model = Documents
fields = ('id', 'author', 'filename', 'datafile', 'type', …Run Code Online (Sandbox Code Playgroud) 我正在尝试扩展用户模型并使用用户名电话号码。我正在为新用户模型创建自定义用户模型和自定义管理器。
模型.py
from django.contrib.auth.models import AbstractUser, BaseUserManager
from django.core.validators import RegexValidator
from django.db import models
from django.utils.translation import ugettext_lazy as _
class UserManager(BaseUserManager):
"""Define a model manager for User model with no username field."""
use_in_migrations = True
def _create_user(self, phone, password, **extra_fields):
"""Create and save a User with the given phone and password."""
if not phone:
raise ValueError('The given phone must be set')
self.phone = phone
user = self.model(phone=phone, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_user(self, phone, password=None, **extra_fields):
"""Create …Run Code Online (Sandbox Code Playgroud) 如何连接特定模型列表的输出,这些模型的实例由不同的字段过滤?例如,我有一个地方模型和两个不同的URL。一个显示整个列表,另一个显示只有new_place = True的实例。使用django-filter做一个API。
models.py
class Places(models.Model):
main_photo = models.ImageField(upload_to = 'album/')
place = models.CharField(max_length=100)
new_place = models.BooleanField(default = True)
editor_choice = models.BooleanField(default = False, verbose_name = "Editors choice")
most_popular = models.BooleanField(default = False, verbose_name = "Most popular")
Run Code Online (Sandbox Code Playgroud)
序列化器
class PlaceSerializer(ModelSerializer):
url = HyperlinkedIdentityField(
view_name='places_api:detail',
lookup_field='pk'
)
class Meta:
model = Places
fields = (
'url',
'id',
'main_photo',
'name',
'new_place',
'most_popular',
'editor_choice',
)
Run Code Online (Sandbox Code Playgroud)
full_list_views.py
class PlacesListAPIView(ListAPIView):
queryset = Places.objects.all()
serializer_class = PlaceSerializer
Run Code Online (Sandbox Code Playgroud)
new_places_views.py
class PlacesNewListAPIView(ListAPIView):
queryset = Places.objects.all()
serializer_class = PlaceSerializer …Run Code Online (Sandbox Code Playgroud) 我使用drf-yasg库为开发人员前端生成项目文档。我不知道如何将数据添加到参数和响应字段
例如,这个类
class VendorsCreateView(APIView):
"""
:param:
data = {
"vendor_name": "TestName",
"country": "Belarus",
"nda": "2020-12-12",
"parent": "",
"contacts": [{"contact_name": "Mrk", "phone": "2373823", "email": "dRqT@rgmail.com"},
{"contact_name": "Uio", "phone": "34567", "email": "rdq@gmail.com"}
]
}
:return: swagger name
"""
Run Code Online (Sandbox Code Playgroud)
如何添加这些参数?
我正在处理一个包含大量嵌套信息的 json 文件。为此,UploadElementFromExcelFile(APIView)我在类中使用嵌套循环,在调用serializer.save()方法的最后。然后在ElementCommonInfoSerializer序列化程序中的create()方法中,我保存/更新从序列化程序接收到的数据。此外,我创建/更新一个RfiParticipationStatus模型,该模型仅与最高嵌套级别(使用parent_category变量)相关。但是由于为循环的最底层成员调用了 create 方法,因此我对该RfiParticipationStatus模型进行了大量无用的数据库查询。同样的事情company_information节省。这是来自共享 json 文件的额外信息。它不引用序列化对象,我只需要在 post 方法调用的最开始保存 company_information 一次。在我的代码实现中,根据 for 循环的深度和内容,保存请求会发生数百次。
json数据样本
[
{
"Company_info": [
{
"question": "Company name",
"answer": "Test"
},
{
"question": "Parent company (if applicable)",
"answer": "2test"
},
{....},
{....}
]
},
{
"Parent Category": " rtS2P",
"Category": [
{
"Analytics": [
{
"Data Schema": [
{ '....': "",
"Attachments/Supporting Docs and Location/Link": "tui",
"SM score": 4,
"Analyst …Run Code Online (Sandbox Code Playgroud) django ×6
python ×2
aws-lambda ×1
drf-yasg ×1
fastapi ×1
gitlab ×1
mysql ×1
python-3.x ×1
starlette ×1