我正在使用 django 2.0 和 python 3.6。
用户注册包括发送验证邮件。而且这个邮件发送过程需要更长的时间,让用户一直等待。
我需要什么?:如果用户注册表单有效,则邮件详细信息将发送到另一个任务处理程序,无论邮件是否发送,该功能都必须恢复并返回响应。
def new_user_registration(request):
form = CustomUserCreationForm(request.POST or None)
if form.is_valid():
user = form.save()
send_verification_mail(user) #<= taking more time.
return render(request, 'registration/signup.html')
Run Code Online (Sandbox Code Playgroud)
即,send_verification_mail必须异步调用。如何实现?
注意:我是 django 和 python 的新手。
我正在用芹菜运行定期任务。其中一项任务通过过滤器从数据库获取对象:
pages = Page.objects.filter(active=True)
Run Code Online (Sandbox Code Playgroud)
最初(在启动 celery 本身之前),db 中有 10 个这样的对象active=True。该任务在启动时会在所有这 10 个对象上相应地执行。
from django.db import transaction
from celery.task import task
from celery import group
from .models import Page
#@transaction.atomic
@task()
def check_pages():
#@transaction.commit()
pages = Page.objects.filter(active=True) #not updated later
g = group(page_check.s(page.id) for page in pages)
g()
#settings.py
app.conf.beat_schedule = {
'run-every-1-second': {
'task': 'tasks.check_pages',
'schedule': 1.0,
},
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我添加另一个Page对象active=True,则任务中不会识别或过滤该对象(该任务已经定期运行)。
我知道obj.reload_from_db()。但这仅适用于重新加载对象,而不适用于<QuerySet>.
我也尝试使用transaction.commit()with @transaction.atomic。但这会停止任务的执行,因为事务不适用于多个工作人员和任务。
我在这里做错了什么?
堆:
姜戈3.0.2 蟒蛇3.8.1 芹菜4.4.0 雷迪斯3.2.0
启动芹菜的命令:celery -A app_project worker -l info
我用来celery在我的项目中运行后台任务django。在开发机器上它运行完美,没有任何错误。开发和生产都在同一个堆栈上运行;我已经手动检查并匹配它们。然而,我仍然面临这个问题。
问题:Celery 在尝试对数据库进行查询时抛出以下错误。
Traceback (most recent call last):
File "/webapps/app/.virtualenvs/base38/local/lib/python3.8/site-packages/celery/app/trace.py", line 385, in trace_task
R = retval = fun(*args, **kwargs)
File "/webapps/app/.virtualenvs/base38/local/lib/python3.8/site-packages/celery/app/trace.py", line 650, in __protected_call__
return self.run(*args, **kwargs)
File "/webapps/app/backend/app/tasks.py", line 22, in task_assign_photo_to_dish
if dishq.exists():
File "/webapps/app/.virtualenvs/base38/local/lib/python3.8/site-packages/django/db/models/query.py", line 777, in exists
return self.query.has_results(using=self.db)
File "/webapps/app/.virtualenvs/base38/local/lib/python3.8/site-packages/django/db/models/sql/query.py", line 537, in has_results
return compiler.has_results()
File "/webapps/app/.virtualenvs/base38/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1114, in has_results
return bool(self.execute_sql(SINGLE))
File "/webapps/app/.virtualenvs/base38/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", …Run Code Online (Sandbox Code Playgroud) 我一直在寻找一个错误,一个解决方案说要做:“文件>使缓存无效并重新启动”
但后来我发现我的build.gradle替换为未知数据。
后来我又用“以前的”数据替换了它。并再次执行相同的“文件 > 使缓存无效并重新启动”
现在,我的activity_main.xml文件被替换为:
<component name="libraryTable">
<library name="Gradle: com.android.support.constraint:constraint-layout-solver:1.1.3@jar">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.support.constraint/constraint-layout-solver/1.1.3/bde0667d7414c16ed62d3cfe993cff7f9d732373/constraint-layout-solver-1.1.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
Run Code Online (Sandbox Code Playgroud)
是什么触发了这个?我在这里丢失了我的 XML 代码。
我有一个抽象模型和两个子模型,例如:
class Invoice(models.Model):
user = models.ForeignKey("User", related_name='%(class)s')
class Meta:
abstract=True
class SaleInvoice(Invoice):
field_sale = models.CharField(max_length=255)
class PurchaseInvoice(Invoice):
field_purchase = models.CharField(max_length=255)
Run Code Online (Sandbox Code Playgroud)
现在,子模型的反向名称将是saleinvoicesand purchaseinvoices。但我需要的是sale_invoices和purchase_invoices。如何实现这一目标?CamelCase 之间有一个下划线。
django ×4
python ×3
python-3.x ×3
celery ×2
django-forms ×2
android ×1
celerybeat ×1
django-views ×1
redis ×1