通过 Heroku 访问 Django API 返回"detail":"Unsupported media type " application/x-www-form-urlencoded\



我用gunicorn在Heroku上部署了Django项目。它基本上只是api(没有模板(。例如,当我部署heroku并在浏览器中访问<heroku url>/api/login时登录后的数据已经是json格式,它总是返回"detail": "Unsupported media type "application/x-www-form-urlencoded" in request."

但是当我在localhost上做同样的操作时,用户会得到身份验证,并且我会收到一个包含用户数据的响应。。。

登录的post数据示例:{ "email": "ana@test.com", "password": "ana1234567890" }

parser_classes = [JSONParser]被添加到我没有图像或文件的每个视图上(我正在使用FileUploadParser(。

我在Heroku上部署了gunicorn,因为在localhost上我永久收到了";未经授权的";来自后端(对于我的大多数视图,Permission Class都是"isAuthenticated"(经过一些研究,我发现可能没有发送授权标头(这里的APACHE WSGIPassAuthorization On是一个解决方案(但我没有运行APACHE服务器,我也不希望我的机器上没有运行Web服务器

我想如果我用gunicorn把它部署在heroku上,我可以在没有";未经对话的";头,但我运行了其他错误,如"detail": "Unsupported media type "application/x-www-form-urlencoded" in request."。。或者数据库连接被拒绝。

在我的前端,我发送以下标题

// Headers
const token_config = {
headers: {
'content-type': 'application/json',
accept: 'application/json',
'Authorization': 'Bearer ${token}',
//withCredentials : true,
},
};

并且前端当然也接收到";错误的中介类型错误"。

如果有人能提供一份详细的";howTo";Django DRF+在Heroku上的postgres。。。我没有看过很多方法,但没有一个能提供合适的解决方案。。

我现在的主要问题是。。。

  • settings.py需要什么才能使后端在heroku上像在localhost上一样正常工作?

  • 我真的需要手动启动heroku-postgres数据库吗heroku pg:psql-postgresql-shaped-60432-每次部署后应用程序?-因为如果我不这样做,herocu日志显示:

    2020-09-09T11:11:15.028985+00:00 app[web.1]: connection = Database.connect(**conn_params)
    2020-09-09T11:11:15.028985+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/psycopg2/__init__.py", line 126, in connect
    2020-09-09T11:11:15.028986+00:00 app[web.1]: conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
    2020-09-09T11:11:15.028986+00:00 app[web.1]: django.db.utils.OperationalError: could not connect to server: Connection refused
    2020-09-09T11:11:15.028987+00:00 app[web.1]: Is the server running on host "localhost" (127.0.0.1) and accepting
    2020-09-09T11:11:15.028987+00:00 app[web.1]: TCP/IP connections on port 5432?
    

例如,有了这个错误+访问/api/login,我得到了503或500的HTTP状态…

我的需求.txt:

Django==3.1.1
django-allauth==0.42.0
django-cors-headers==3.5.0
django-environ==0.4.5
django-rest-auth==0.9.5
django-sslserver==0.20
djangorestframework==3.11.1
djangorestframework-simplejwt==4.1.3
gunicorn==20.0.4
image==1.5.27
importlib-metadata==1.7.0
oauthlib==3.1.0
Pillow==7.2.0
psycopg2-binary==2.8.2
PyJWT==1.7.1

提前感谢并致以最良好的问候!

好的,我解决了!

我基本上必须添加所有设置

import django_heroku
import dj_database_url
ALLOWED_HOSTS = ['*']
DATABASES = {'default': dj_database_url.config(default='URI from Heroku-color- postgres database')}
# ALL THE STATIC PATHS
MEDIA_ROOT = os.path.join(BASE_DIR,'media')
MEDIA_URL = '/media/'

#location where django collect all static files
STATIC_ROOT = os.path.join(BASE_DIR,'static')# location where you will store your static files
STATICFILES_DIRS = [os.path.join(BASE_DIR,'walkAdog/static')]
STATIC_URL = '/static/'

# for deployement on heroku
django_heroku.settings(locals())

此时,原点错误“detail”: “Unsupported media type ”application/x-www-form-urlencoded“ in request.”不再出现

但出现了下一个错误:没有名为"django_heroku"的模块。。。所以我发现,django-heroku没有正确安装,因为pipenv install psycopg崩溃了——对我来说就像我对installed pipenv install psycopg2==2.7.7django whitenoise dj-database-url psycopg2一样

相反,数据库是";空"-相当可预测。。

所以我在本地主机上进行了迁移然后提交项目/迁移文件夹(以及其他文件夹(并运行heroku运行python manage.py迁移

->现在一切都很好

基本上,我只需要按照https://medium.com/@hdsingh13/deploying-django-app-on-heroku-with-postgres-as-backend-b2f3194e8a43。。我只是有点不明白所有这些东西的必要性。。

最新更新