You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部署在Railway的Django+Tweepy应用出现401认证错误求助

问题:Django+Tweepy本地运行正常,部署到Railway后出现401 Unauthorized错误

错误日志

应用日志输出的错误信息如下:

File "/app/tweet_scrapper/wsgi.py", line 16, in <module>
application = get_wsgi_application()
File "/opt/venv/lib/python3.9/site-packages/django/core/wsgi.py", line 12, in get_wsgi_application
django.setup(set_prefix=False)
File "/opt/venv/lib/python3.9/site-packages/django/__init__.py", line 24, in setup
apps.populate(settings.INSTALLED_APPS)
File "/opt/venv/lib/python3.9/site-packages/django/apps/registry.py", line 124, in populate
app_config.ready()
File "/app/tweets/apps.py", line 10, in ready
from . import jobs
File "/app/tweets/jobs.py", line 85, in <module>
scrap()
File "/app/tweets/jobs.py", line 69, in scrap
searched_tweets = api.search_tweets(
File "/opt/venv/lib/python3.9/site-packages/tweepy/api.py", line 33, in wrapper
return method(*args, **kwargs)
File "/opt/venv/lib/python3.9/site-packages/tweepy/api.py", line 46, in wrapper
return method(*args, **kwargs)
File "/opt/venv/lib/python3.9/site-packages/tweepy/api.py", line 1309, in search_tweets
return self.request(
File "/opt/venv/lib/python3.9/site-packages/tweepy/api.py", line 263, in request
raise Unauthorized(resp)
tweepy.errors.Unauthorized: 401 Unauthorized
32 - Could not authenticate you.
Traceback (most recent call last):
File "/opt/venv/lib/python3.9/site-packages/gunicorn/arbiter.py", line 502, in spawn_worker
worker.init_process()
File "/opt/venv/lib/python3.9/site-packages/gunicorn/workers/base.py", line 114, in init_process
self.wsgi = self.app.wsgi()
File "/opt/venv/lib/python3.9/site-packages/gunicorn/app/base.py", line 66, in wsgi
self.callable = self.load()
File "/opt/venv/lib/python3.9/site-packages/gunicorn/app/wsgiapp.py", line 65, in load
return self.load_wsgiapp()
File "/opt/venv/lib/python3.9/site-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
return util.import_app(self.app_uri)
File "/opt/venv/lib/python3.9/site-packages/gunicorn/util.py", line 356, in import_app
__import__(module)
File "/app/tweet_scrapper/wsgi.py", line 16, in <module>
application = get_wsgi_application()
File "/opt/venv/lib/python3.9/site-packages/django/core/wsgi.py", line 12, in get_wsgi_application
django.setup(set_prefix=False)
File "/opt/venv/lib/python3.9/site-packages/django/__init__.py", line 24, in setup
apps.populate(settings.INSTALLED_APPS)
File "/opt/venv/lib/python3.9/site-packages/django/apps/registry.py", line 124, in populate
app_config.ready()
File "/app/tweets/apps.py", line 10, in ready
from . import jobs
File "/app/tweets/jobs.py", line 85, in <module>
scrap()
File "/app/tweets/jobs.py", line 69, in scrap
searched_tweets = api.search_tweets(
File "/opt/venv/lib/python3.9/site-packages/tweepy/api.py", line 33, in wrapper
return method(*args, **kwargs)
File "/opt/venv/lib/python3.9/site-packages/tweepy/api.py", line 46, in wrapper
return method(*args, **kwargs)
File "/opt/venv/lib/python3.9/site-packages/tweepy/api.py", line 1309, in search_tweets
return self.request(
File "/opt/venv/lib/python3.9/site-packages/tweepy/api.py", line 263, in request
raise Unauthorized(resp)
tweepy.errors.Unauthorized: 401 Unauthorized
32 - Could not authenticate you.

相关代码与配置

认证代码

secret_key = os.environ.get('secret_key')

secret_key_api = os.environ.get('secret_key_api')

access_token = os.environ.get('acess_token')

access_token_api = os.environ.get('access_token_api')

auth = tweepy.OAuthHandler(secret_key, secret_key_api)

auth.set_access_token(access_token, access_token_api)

api = tweepy.API(auth)

requirements.txt

Django==4.0.5
django-environ==0.9.0
asgiref==3.4.1
pytz==2022.5
schedule==1.1.0
tweepy==4.11.0
tzdata==2022.1
urllib3==1.26.9
gunicorn==19.0.0
whitenoise==6.0.0

已知信息

  • 本地运行正常,拥有Twitter API高级访问权限
  • 已核对密钥和令牌,通过环境变量获取

解决办法

1. 修复环境变量拼写错误

认证代码中access_token = os.environ.get('acess_token')存在拼写错误:acess_token应为access_token,这会导致无法获取正确的访问令牌,直接引发401错误。修正后重新部署。

2. 验证Railway环境变量配置

  • 登录Railway控制台,确认所有环境变量的键名与代码中os.environ.get()的参数完全一致,环境变量键名通常区分大小写。
  • 可以在代码中添加调试日志,验证环境变量是否成功加载(注意不要打印完整密钥,仅验证是否非空):
import logging
logger = logging.getLogger(__name__)

# 修正拼写后的代码
access_token = os.environ.get('access_token')
logger.debug(f"access_token 是否加载: {bool(access_token)}")

3. 确认Twitter API密钥有效性

  • 登录Twitter开发者平台,检查当前使用的API密钥、令牌是否绑定到拥有高级访问权限的项目,且未被限制或过期。
  • 本地使用Railway配置的环境变量运行代码,模拟生产环境的认证流程,排查密钥是否有效。

4. 调整代码执行时机

当前代码在Django的apps.py的ready()方法中直接导入并执行scrap()函数,会在应用启动时立即触发API请求。建议:

  • 将scrap()函数调用移出模块级别,改为通过定时任务工具(如Celery)、Django管理命令或API接口触发。
  • 避免在应用初始化阶段执行网络请求,防止因环境未完全就绪导致的认证失败。

5. 检查依赖版本兼容性

  • 尝试升级Tweepy到最新稳定版,修复可能存在的认证逻辑bug,更新requirements.txt中的Tweepy版本(如tweepy==4.14.0)后重新部署。
  • 确认urllib3版本与Tweepy兼容,无需刻意降级或升级。

内容的提问来源于stack exchange,提问作者Utsav Meena

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 03:05:19