【问题标题】:Can't display image on browser with django rest framework无法使用 django rest 框架在浏览器上显示图像
【发布时间】:2018-07-13 12:27:07
【问题描述】:

我有一个与 SO post 类似的问题,但它的答案都没有帮助我解决我的问题。

我们在这里:我能够在服务器上保存图像,但无法从 API 图像超链接获取图像。

我的文件:

模型.py

class Summary(models.Model):

    question_text = models.CharField(max_length=255)
    created_at = models.DateTimeField(auto_now_add=True)
    cover_image = models.ImageField(upload_to='cover_image/', max_length=255)
    userProfileSummary = models.ManyToManyField(UserProfile, through='UserProfileSummary')

    def __str__(self):
        return self.question_text

views.py

class Summary(models.Model):

    question_text = models.CharField(max_length=255)
    created_at = models.DateTimeField(auto_now_add=True)
    cover_image = models.ImageField(upload_to='cover_image/', max_length=255)
    userProfileSummary = models.ManyToManyField(UserProfile, through='UserProfileSummary')

    def __str__(self):
        return self.question_text

serializer.py

class SummarySerializer(serializers.ModelSerializer):
    """A serializer for summary item"""
    cover_image = serializers.ImageField(max_length=None, use_url=True)

    class Meta:
        model = models.Summary
        exclude = ('userProfileSummary',)

settings.py

STATIC_URL = '/static/'

STATICFILES_DIRS =(
    os.path.join(BASE_DIR, 'static'),
    '/static',
)

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

urls.py

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from django.conf.urls.static import static
from django.conf import settings
from . import views

router = DefaultRouter()
router.register('Hello-viewset', views.HelloViewSet, base_name='hello-viewset')

urlpatterns= [
    path('hello-view/', views.HelloApiView.as_view()),
    path('UserProfileSummary/<int:id>/', views.UserProfileSummaryViewSet.as_view()),
    path('', include(router.urls))
]+static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

应用结构:

- myproject/
 - cover_image/
 - media/
 - myproject_api/
  - models.py
  - serializers.py
  - ...
  - myproject/
   - settings.py
   - ...

还有,我的主要 urls.py 文件 (myproject/urls.py)

from django.contrib import admin
from django.urls import path, include
from django.conf import settings

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('myproject_api.urls'))
]

我可以成功发出 POST 请求并显示正确的图片链接,但是当我点击图片链接时出现错误。

怎么了?

请帮忙!

【问题讨论】:

  • 您是否尝试在主项目 url 中添加以下行 .. url(r'^media/(?P.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT,}), .. 我认为您已将其添加到您的应用程序 URL 中,而不是在根 URL 中。在您的生产环境中,您需要配置 Web 服务器以提供静态文件。
  • 我已经添加了,但是还是不行。我还编辑了我的代码以添加我的主 urls.py 文件的结构以防...
  • 添加到主 urls 中 .. urlpatterns = [ path('admin/', admin.site.urls), path('api/', include('myproject_api.urls')), url(r'^media/(?P.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT,}) ]
  • 收到此错误:NameError: name 'url' is not defined
  • 遇到了另一个错误:(:TypeError: view must be a callable or a list/tuple in the case of include().

标签: python django rest django-models django-rest-framework


【解决方案1】:

问题是您在 app/urls 中添加了静态媒体 url。将其移至您的项目/网址

项目/urls.py

from django.conf.urls import include, url
from django.conf import settings
from django.views.static import serve

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('myproject_api.urls')),
    url(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT,})
]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    相关资源
    最近更新 更多