小编Sta*_*ute的帖子

22
推荐指数
4
解决办法
3万
查看次数

在 Django 中格式化 DateTimeField

DateTimeField当使用auto_now_add这种方式在 Django 中保存时间戳时:

creation_timestamp = models.DateTimeField(auto_now_add=True)
Run Code Online (Sandbox Code Playgroud)

该字段以毫秒为单位保存:

2018-11-20T15:58:44.767594-06:00
Run Code Online (Sandbox Code Playgroud)

我想将其格式化为无毫秒显示:

2018-11-20T15:58:44-06:00
Run Code Online (Sandbox Code Playgroud)

但我能想到的唯一选择并不能完全显示我所需要的:

format="%Y.%m.%dT%H:%M:%S%z"给我2018.11.20T15:58:44-0600 如何按照我需要的方式格式化该字段?

或者,我宁愿DateTimeField完全不保存任何毫秒,但auto_now_add允许做这种事情吗?

python django django-models

10
推荐指数
2
解决办法
4万
查看次数

drf-yasg 提供了错误的 URI 路径

在我的应用程序中,我需要有多个 Swagger 页面,其中包含多个客户端的分组端点。

我的一个客户端(路径)提供移动应用程序 API,另一个提供 Web 客户端 API。URL 模式相应地保持在 2 种不同中urls.py

我正在使用drf-yasg为我的 API 生成模式。

为了生成swagger规范,我schema_views为每个urls.py文件分别初始化 2 个,如下所示:

from api_mobile.urls import urlpatterns as mobile_patterns
from api_web.urls import urlpatterns as web_patterns

mobile_schema_view = get_schema_view(
openapi.Info(
    title="Mobile API",
    default_version='v3',
),
public=True,
permission_classes=(permissions.AllowAny,),
patterns=mobile_patterns,
)

web_schema_view = get_schema_view(
    openapi.Info(
        title="Web API",
        default_version='v1',
    ),
    public=True,
    permission_classes=(permissions.AllowAny,),
    patterns=web_patterns,
)

urlpatterns = [
    path(
        'api/mobile/docs',
        mobile_schema_view.with_ui('swagger', cache_timeout=0),
        name='mobile-schema-ui'
    ),
    path(
        'api/web/docs',
        web_schema_view.with_ui('swagger', cache_timeout=0),
        name='web-schema-ui'
    ),

    path('api/mobile/v3/', include('api_mobile.urls'), …
Run Code Online (Sandbox Code Playgroud)

django swagger django-rest-framework openapi drf-yasg

6
推荐指数
1
解决办法
3316
查看次数

更新DOM而不重新加载Django中的页面

我在DOM中有两个选择列表,第一个选择列表是在视图的方法加载页面时在URL加载期间填充的。第二个选择列表的内容取决于用户在第一个选择列表中选择的内容。当用户在第一个选择列表中进行选择,在python中进行一些操作,返回要在第二个选择列表中显示的vallues列表,然后在不刷新页面的情况下填充它时,如何将python方法绑定到事件?

我的模板如下所示:

{% block content %}

{% if list_of_events %}
    <form>
        <select>
            {% for event in list_of_events %}
                <option value="name">{{ event.module }}</option>
            {% endfor %}
        </select>
    </form>

{% else %}
    <p>No events available now.</p>
{% endif %}
Run Code Online (Sandbox Code Playgroud)

下一个条件是等待first_selection参数,该参数应在用户在第一个选择列表中选择一个值后返回给模板。

{% if first_selection %}
    <form>
        <select>
            {% for room in list_of_rooms %}
                <option value="name">{{ room.id }}</option>
            {% endfor %}
        </select>
    </form>
{% endif %}

<input type="submit" value="Submit">

{% endblock %}
Run Code Online (Sandbox Code Playgroud)

我的views.py方法如下所示:

def events(request):
try:
    list_of_events = Event.objects.all()
except:
    raise Http404('Something\'s …
Run Code Online (Sandbox Code Playgroud)

python django

5
推荐指数
1
解决办法
4340
查看次数

Dockerizing现有的Django项目

我无法确定如何对现有的Django应用进行docker化。我已经阅读了Docker的这本官方手册,解释了如何在创建Docker映像期间创建Django项目,但是我需要使用相同的方法对现有项目进行Docker化。

这种方法的主要目的是,我不需要一直在本地构建docker映像,而我想要实现的是将我的代码推送到已连接docker-hub watcher的远程存储库,并且代码库已更新,正在服务器上自动构建。

现在,我的Dockerfile看起来像:

FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install Django
RUN pip install djangorestframework
RUN pip install PyQRCode
ADD . /code/
Run Code Online (Sandbox Code Playgroud)

谁能解释我应该如何构成Dockerfile,是否需要使用docker-compose.yml(如果是,如何?)来实现上述功能?

此问题的解决方案:

FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
RUN pip install *name of package*
RUN pip install *name of another package*
ADD . /code/
EXPOSE 8000
CMD python3 manage.py runserver 0.0.0.0:8000
Run Code Online (Sandbox Code Playgroud)

要么

FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code …
Run Code Online (Sandbox Code Playgroud)

python django docker dockerfile docker-compose

5
推荐指数
1
解决办法
1875
查看次数

如何在 Django 中使用 Pytest 测试经过身份验证的 POST 请求

我想使用 Pytest 在 API 上测试经过身份验证的发布请求。这是我目前正在做的事情:

 def test_auth_user_can_create(self, client):
      
    
    url = api_reverse('crud-simulation_api')

    data = {
        "project": "testproject",
        ....
    }

        response = client.post(url, json=data)
        assert response.status_code == 200
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为它返回 401(未授权)而不是 200。这是有道理的,因为夹具是客户端而不是管理员客户端。

然而,如果我传入 admin_client 而不是 client,它会给我一个错误的请求。不过,我发送的数据应该没问题。

我也尝试像这样传递标头(因为我使用 JWT 授权):

token = "bigassstringwhichismytoken"

headers = {
        "Authorization": "JWT " + token
    }
Run Code Online (Sandbox Code Playgroud)

最后我尝试登录之前给了我一个 403 (Forbidden):

def test_auth_user_can_create_simulation_api(self, client, django_user_model):
     
    username = "Jack"
    password = "password"

    django_user_model.objects.create_user(username=username, password=password)
    client.login(username=username, password=password)

    url = api_reverse('crud-simulation_api')

    data = {
        "project": "testproject",
        ...
    }

    response = client.post(url, json=data)
    assert …
Run Code Online (Sandbox Code Playgroud)

python django automated-tests pytest django-rest-framework

5
推荐指数
1
解决办法
4165
查看次数

JSONField 嵌套表示的序列化器

在我的应用程序中,有一个模型将配置存储在其字段之一中。该字段定义为JSONField。我有一个严格的结构来定义该字段的内容应该是什么样子,但我正在努力寻找一种方法来序列化它以验证 API 请求中的数据。

目前有效但不验证内部内容的解决方案config_field是盲目接受任何符合对象要求的内容json

我的模型的简化版本:

class MyModel(models.Model):
    config_field = JSONField(...)
    ...
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题,这是存储在中的数据结构的简化版本config_field

{"some_config_int": 42, "some_config_vars": [{"id": 1}, {"id": 2}]}
Run Code Online (Sandbox Code Playgroud)

这是我的序列化器的简化版本:

class MyModelSerializer(serializers.ModelSerializer):
        config_field = serializers.JSONField(required=False)
        class Meta:
            model = MyModel
            fields = ('config_field', ...)
Run Code Online (Sandbox Code Playgroud)

不过,我想要实现的是为内部内容的嵌套表示(参考 DRF 文档config_field)提供一个序列化器。到目前为止我尝试过的(但不起作用):

class ConfigVarsSerializer(serializers.Serializer):
        id = serializers.IntegerField(required=True)

class ConfigFieldsSerializer(serializers.Serializer):
    some_config_int = serializers.IntegerField(required=True)
    some_config_vars = serializers.ListField(child=ConfigVarsSerializer,required=True)

class MyModelSerializer(serializers.ModelSerializer):
            config_field = ConfigFieldsSerializer(required=False)
            class Meta:
                model = MyModel
                fields = ('config_field', ...)
Run Code Online (Sandbox Code Playgroud)

这样,可以选择 POST/PUT 具有配置的对象,但如果config_field位于请求正文中,则应提供整个嵌套对象。

python django django-serializer django-rest-framework

4
推荐指数
1
解决办法
4883
查看次数

在Python中将“字节”对象分成块

我需要使用TCP ProtocolPython的socket模块通过特定长度(比如40字节)的“包”发送一个数组。首先,我生成以下示例数组ints

int_array = [i**2 for i in range(1, 100)]
Run Code Online (Sandbox Code Playgroud)

然后我将其转换为bytes对象:

encoded_array = str(int_array).encode()
Run Code Online (Sandbox Code Playgroud)

为了检查encoded_array我正在使用的对象的长度len(encoded_array),在这种特殊情况下等于 551 字节。

假设我想发送 40 字节长的包:这使得 13 个包和最后一个字节的剩余部分encoded_array总共 14 个包。但我无法弄清楚如何按字节数本身将bytes对象划分为更小的对象的方法。bytes有谁知道如何做到这一点?

我也知道我可能以完全错误的方式这样做,所以请告诉我如何通过TCP协议发送“部分”数据。也许根本不需要进行这种拆分?

python sockets tcp python-3.x

3
推荐指数
1
解决办法
7216
查看次数

如何以编程方式上传本地文件作为 Django 模型字段?

我在尝试从本地路径上传文件时遇到问题FileField

我已在S3存储桶中正确配置了 CDN 后端,并将其用作PrivateMediaStorage我的模型字段之一:

class MyModel(models.Model):
    some_file = models.FileField(storage=PrivateMediaStorage())
    ...
Run Code Online (Sandbox Code Playgroud)

通过这个非常简单的配置,每当我创建/更新模型时,django-admin它都会被保存并附加文件,并some_file正确上传到S3存储桶。

然而,如果我尝试以编程方式创建/更新模型实例(例如通过自定义manage.py命令),则会创建模型实例本身,但附件永远不会上传到 CDN。这是我用来上传文件的代码的简化版本:

class Command(BaseCommand):
    help = 'Creates dummy instance for quicker configuration'

    def handle(self, *args, **options):
        some_file = os.path.join(os.path.dirname(__file__), '../../../temporary/some_image.png')

        if not os.path.exists(some_file):
            raise CommandError(f'File {some_file} does not exist')
        else: 
            instance, created = MyModel.objects.get_or_create(defaults={'some_file': some_file}, ...)
Run Code Online (Sandbox Code Playgroud)

我的实现中缺少什么以及需要调整什么才能允许从本地存储上传文件?

python django django-storage

2
推荐指数
1
解决办法
3317
查看次数

在cordova ios应用程序中将字段添加到info.plist

我需要创建自定义插件,将条目添加到 cordova/angular4 iOS 应用程序的 info.plist 中。(在这种情况下,如果按下主页按钮,则退出应用程序)

我需要添加行:

<key>UIApplicationExitsOnSuspend</key>
<true/>
Run Code Online (Sandbox Code Playgroud)

这是我写的插件的内容(可能不正确,因为我无法测试它)。

<config-file target="*-Info.plist" platform="ios" parent="UIApplicationExitsOnSuspend">
<array>
  <boolean><true/></boolean>
</array>
</config-file>
Run Code Online (Sandbox Code Playgroud)

需要什么才能将此插件“导入”到 config.xml 中,以便每次我执行cordova build iosplist 文件时都会有我需要的条目?

我读过这篇文章,但不明白它是如何完成的。

通过 Cordova config.xml 将条目添加到 iOS .plist 文件

Cordova:从plugin.xml修改*-Info.plist

plugins ios cordova angular

1
推荐指数
1
解决办法
2934
查看次数

使用可变数量的参数过滤多个 Django 模型字段

我正在实现搜索功能,并可以选择通过匹配多个表和这些表中的多个字段来查找记录。

Customer假设我想通过他/她的名字或姓氏,或者通过存储Order在与 不同模型中的放置 ID 来查找Customer。我已经实现的简单场景是用户仅在搜索字段中输入单个单词,然后我使用 Django使用直接字段引用或类似引用Q来查询模型:Orderrelated_query_name

result = Order.objects.filter(
        Q(customer__first_name__icontains=user_input)
        |Q(customer__last_name__icontains=user_input)
        |Q(order_id__icontains=user_input)
        ).distinct()
Run Code Online (Sandbox Code Playgroud)

小菜一碟,完全没有问题。

但是,如果用户想要缩小搜索范围并在搜索字段中输入多个单词该怎么办?

示例:用户输入Bruce并通过搜索返回大量记录。

现在他/她想要更具体,并将客户的姓氏添加到搜索中。因此Bruce Wayne,在将其分成我拥有的单独部分之后,搜索Bruce变为 和Wayne。显然,我不想搜索Orders模型,因为order_id它是一个单词实例,并且足以立即找到客户,因此对于这种情况,我完全将其从查询中删除。

现在我试图通过名字和姓氏来匹配客户,我还想处理提供数据的顺序是随机的情况,以正确处理Bruce WayneWayne Bruce,这意味着我仍然有客户的全名,但名字和姓氏的位置名字不固定。

这就是我正在寻找答案的问题:如何构建查询来搜索模型的多个字段,而不知道哪些搜索词属于哪个表。

我猜这个解决方案很简单,并且肯定有一种优雅的方法来创建这样的动态查询,但我想不出一种方法。

django django-queryset django-q

1
推荐指数
1
解决办法
1911
查看次数