Добавление задания из 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.

Вернуться на верх