Добавление задания из views.py - почему оно не работает таким образом?
Вот дерево моих приложений Django:
.
├── admin.py
├── apps.py
├── forms.py
├── __init__.py
├── management
│ └── ...
├── migrations
│ ├── ...
├── models.py
├── scheduler
│ ├── __pycache__
│ │ ├── jobs.cpython-39.pyc
│ │ └── scheduler.cpython-39.pyc
│ └── scheduler.py
├── static
│ └── ...
├── tests.py
├── urls.py
└── views.py
Когда у меня в файле scheduler.py есть следующее:
from apscheduler.schedulers.background import BackgroundScheduler
from auctions.models import Listing, Bid
scheduler = BackgroundScheduler()
def close_listing(id):
listing = Listing.objects.get(id=id)
bids = Bid.objects.filter(listing=listing).all()
listing.closed = True
if bids:
listing.winner = bids.last().user
listing.save()
and in views.py this:
from .scheduler.scheduler import scheduler, close_listing
@login_required(login_url='/login/')
def create_listing(request):
if request.method == "POST":
form = ListingForm(request.POST)
if form.is_valid():
new_listing = form.save()
new_listing.owner = request.user
new_listing.current_price = new_listing.starting_price
new_listing.save()
# this is important line
scheduler.add_job(
close_listing, 'date', run_date=datetime.now() + timedelta(seconds=5),
args=[new_listing.id])
return HttpResponseRedirect(reverse("listing", kwargs={'id': new_listing.id}))
else:
return HttpResponse('invalid')
else:
form = ListingForm()
return render(request, "auctions/create_listing.html", {
'form': form
})
Когда я создаю листинг и задание должно быть выполнено (через пять секунд), я получаю эту ошибку:
Job "close_listing (trigger: date[2021-09-07 20:39:25 UTC], next run at: 2021-09-07 20:39:25 UTC)" raised an exception
Traceback (most recent call last):
File "/home/andrej/Dokumenty/Programming/CS50 Web/commerce/venv/lib/python3.9/site-packages/apscheduler/executors/base.py", line 125, in run_job
retval = job.func(*job.args, **job.kwargs)
File "/home/andrej/Dokumenty/Programming/CS50 Web/commerce/venv/lib/python3.9/site-packages/django/contrib/auth/decorators.py", line 20, in _wrapped_view
if test_func(request.user):
AttributeError: 'int' object has no attribute 'user'
Однако, когда в scheduler.py у меня есть:
from apscheduler.schedulers.background import BackgroundScheduler
from auctions.models import Listing, Bid
scheduler = BackgroundScheduler()
def close_listing(id):
listing = Listing.objects.get(id=id)
bids = Bid.objects.filter(listing=listing).all()
listing.closed = True
if bids:
listing.winner = bids.last().user
listing.save()
def schedule_job(id):
scheduler.add_job(
close_listing, 'date', run_date=datetime.now() + timedelta(seconds=10), args=[id])
and in views.py this:
from .scheduler.scheduler import schedule_job
@login_required(login_url='/login/')
def create_listing(request):
if request.method == "POST":
form = ListingForm(request.POST)
if form.is_valid():
new_listing = form.save()
new_listing.owner = request.user
new_listing.current_price = new_listing.starting_price
new_listing.save()
# this is important line
schedule_job(new_listing.id)
return HttpResponseRedirect(reverse("listing", kwargs={'id': new_listing.id}))
else:
return HttpResponse('invalid')
else:
form = ListingForm()
return render(request, "auctions/create_listing.html", {
'form': form
})
Работа выполнена без проблем. Почему? Я бы сказал, что версия без функции schedule_job лучше.
Вы уверены, что используемая вами форма является типовой?
Это было столкновение имен, в veiws.py у меня тоже есть функция close_listing.