如何通过按钮点击在后台将我的 Django 函数设置为 运行?

How can I set up my Django function to run in the background from button onclick?

我有一个 Django 项目,其中一个函数当前在我的 html -

的 onclick 上运行
def follow(request):

    api = get_api(request)

    followers = tweepy.Cursor(api.followers_ids, wait_on_rate_limit=True).items()

    for x in followers:
        try:
            api.create_friendship(x)
        except Exception:
            pass

    return render(request, "followed.html")

该功能运行并跟随授权用户的关注者。我的问题是,当部署在我的 pythonanywhere Web 应用程序上时,该函数将在浏览器中加载,然后在大约 10 分钟后超时。我已经对最多 100 个关注者的用户进行了测试,一切正常。

这很好,但是 Twitter API 有速率限制,因此对于一些拥有大量关注者的用户来说,此功能将需要很长时间才能完成。

有没有办法转移到 followed.html 并在后台保留函数 运行 直到它完成?

我添加了 oauth 功能以防万一它们也需要 -


def auth(request):
    # start the OAuth process, set up a handler with our details
    oauth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
    # direct the user to the authentication url
    # if user is logged-in and authorized then transparently goto the callback URL
    auth_url = oauth.get_authorization_url(True)
    response = HttpResponseRedirect(auth_url)
    # store the request token
    request.session['request_token'] = oauth.request_token
    return response

def callback(request):
    verifier = request.GET.get('oauth_verifier')
    oauth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
    token = request.session.get('request_token')
    # remove the request token now we don't need it
    request.session.delete('request_token')
    oauth.request_token = token
    # get the access token and store
    try:
        oauth.get_access_token(verifier)
    except tweepy.TweepError:
        print('Error, failed to get access token')

    request.session['access_key_tw'] = oauth.access_token
    request.session['access_secret_tw'] = oauth.access_token_secret
    print(request.session['access_key_tw'])
    print(request.session['access_secret_tw'])
    response = HttpResponseRedirect(reverse('index'))
    return response

您应该考虑使用任务队列在后台完成工作。一般来说,在处理 HTTP 请求时执行任何“阻塞”的工作(例如,某些事情会让您的服务器等待,例如连接到另一台服务器并获取数据)应该作为后台任务完成。

常见(很好!)Python 任务队列是 Celery and rq - rq is particularly lightweight and also has a Django wrapper django-rq

我会花一些时间阅读 rq 或 Celery 文档,了解如何让你的 Twitter API 调用作为后台任务发生,这将避免你的网络服务器超时。

您可以为此使用异步任务队列(例如芹菜)。看看这个: https://realpython.com/asynchronous-tasks-with-django-and-celery/