小编Pau*_*l J的帖子

使用Django REST Framework进行批量插入的最佳设计模式是什么?

背景

我有一个Django应用程序,允许通过Django REST框架插入记录.

记录将由询问电子表格和其他数据库的客户端应用程序逐行批量插入.REST API允许从Django中抽象出处理数据转换等的其他应用程序.

问题

我想将实际的记录插入与API分离,以提高容错能力和可扩展性.

建议的方法

我正在考虑用Celery做这件事,但我之前没用过它.我正在考虑覆盖perform_create()我现有的DRF ModelViewSets(perform_create()DRF 3.0中添加)来创建工作人员在后台抓取和处理的Celery任务.

DRF文档说perform_create()应该"应该通过调用serializer.save()来保存对象实例".我想知道,在我的情况下,我是否可以忽略此建议,而是让我的Celery任务调用适当的序列化程序来执行对象保存.

例如,我有几个型号:

class Book(models.Model):
    name = models.CharField(max_length=32)

class Author(models.Model):
    surname = models.CharField(max_length=32)
Run Code Online (Sandbox Code Playgroud)

我有这些模型的DRF视图和序列化器:

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book

class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Author

class BookViewSet(viewsets.ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = Book

class AuthorViewSet(viewsets.ModelViewSet):
    queryset = Author.objects.all()
    serializer_class = Author
Run Code Online (Sandbox Code Playgroud)

在例如BookViewSet:覆盖perform_create()是一个好主意吗?

def perform_create(self, serializer):
    create_book_task(serializer.data)
Run Code Online (Sandbox Code Playgroud)

在哪里create_book_task分别是这样的:

@shared_task
def create_book_task(data):
    serializer = BookSerializer(data=data)
    serializer.save() …
Run Code Online (Sandbox Code Playgroud)

django celery django-rest-framework

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

在 Django 中间件中设置 cookie

我想使用自定义 Django 中间件 (Django 1.9) 来检查匿名用户是否已接受网站的条款和条件 - 如果用户尚未单击“同意”,我将向他们显示一个对话框。

\n\n

我不需要将其存储在数据库中,而是更愿意简单地使用 Cookie。我有以下内容settings.py

\n\n
MIDDLEWARE_CLASSES = [\n    'django.middleware.security.SecurityMiddleware',\n    'django.contrib.sessions.middleware.SessionMiddleware',\n    ...\n    'myapp.middleware.app_custom_middleware.TermsMiddleware',]\n\nSESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后我在TermsMiddleware中尝试一些非常基本的东西 - 在这里我故意尝试修改请求响应只是为了让它工作:

\n\n
class TermsMiddleware(object):\n\n    def process_request(self, request):\n        request.session['myCookieKey'] = 'myCookieValue'\n        request.session.save()\n        return\n\n    def process_response(self, request, response):\n        request.session['myCookieKey'] = 'myCookieValue'\n        request.session.save()\n        return response\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我检查浏览器中的响应,我会发现它myCookieKey没有被设置,所以我认为我误解了应该如何编写。

\n\n

我可以像这样在中间件中操作会话,让它在 Django 无论如何要发送的响应中发送的 cookie 中生效吗?该文档听起来我应该能够:

\n\n
\n

它应该返回 None 或 HttpResponse 对象。如果它返回 None,Django 将继续处理该请求,执行任何其他 process_request() 中间件,然后执行 process_view() 中间件,最后执行相应的视图。如果它返回一个 HttpResponse\n 对象,Django 不会\xe2\x80\x99 调用任何其他请求、视图或\n 异常中间件或适当的视图;it\xe2\x80\x99 会将响应中间件应用于该 HttpResponse,并返回结果。 …

python django session django-middleware

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

无法在AWS Elastic Beanstalk上找到Django App的模块

我正在尝试在AWS Elastic Beanstalk上运行Django应用程序,但我看起来似乎可能是PYTHONPATH或virtualenv问题,我无法弄明白.

当我尝试在浏览器中加载页面时,我得到了黄色的Django错误屏幕(我仍处于调试模式):

Exception Value: No module named views.rest
Exception Location: /opt/python/current/app/project/urls.py in <module>, line 3
Python Executable:  /opt/python/run/venv/bin/python
Python Version: 2.7.5
Python Path:    
['/opt/python/run/venv/lib/python2.7/site-packages',
 '/opt/python/current/app',
...
Run Code Online (Sandbox Code Playgroud)

我的urls.py导入是:

from django.conf.urls import patterns, include, url
from django.contrib import admin
from myapp.views.rest import *
Run Code Online (Sandbox Code Playgroud)

如果我进入EC2实例,路径看起来正确; /opt/python/current/app包含我的应用程序,包括/opt/python/current/app/myapp/views/rest.py.

我的目录结构包含(当然还有更多):

app/
    .ebextensions/
        packages.config
        python.config
    .elasticbeanstalk/
        config
        optionsettings.myapp-deployment-env
    project/
        settings.py
    application.py
    myapp/
        views/
            rest.py
            views.py
            __init__.py
Run Code Online (Sandbox Code Playgroud)

__init__.py我有:

from myapp.views.views import *
from myapp.views.rest import *
Run Code Online (Sandbox Code Playgroud)

问题不是特定于这些文件 - 如果我添加另一个导入urls.py失败,所以它就像它根本找不到应用程序.

packages.config …

python django postgresql amazon-web-services amazon-elastic-beanstalk

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