使用Django和Nginx上傳和下載文件

我目前正在嘗試上傳一些文件使用Django和它似乎是工作的大部分。我至少能夠看到文件被添加到Django管理面板中的特定模型中,但是我無法打開它。此外,每當我試圖獲取文件的URL時,我都會被轉發到Django錯誤頁面,并出現一個很好的錯誤,即[Errno 2] No such file or directory: 'media/some_file.csv'

這是我的文件模型:

class File(models.Model):
    challenge = models.ForeignKey(Challenge, on_delete=models.CASCADE, default="")
    file = models.FileField(default="", upload_to="media/")

    def __str__(self):
        return self.challenge.challenge_id

Settings.py :

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

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

上傳功能:

def uploadChallengeFile(request):
    latestChallenge = Challenge.objects.last()
    for file in request.FILES.items():
        file_model = File(challenge=latestChallenge, file=file[0])
        file_model.save()

    data = {"data": [True]}
    return JsonResponse(data, safe=False)

下載功能:

def downloadFile(request, challenge_id):
    challenge = Challenge.objects.filter(challenge_id=challenge_id)
    filename = File.objects.filter(challenge=challenge).values("file")[0]["file"]
    content = open(File.objects.get(challenge=challenge).file.url).read()

    response = HttpResponse(content, content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename=%s' % filename

    return response

urls.py :

url(r'^api/start/download/(?P<challenge_id>[\w.@+-]+)/$', views.backendServices.downloadFile, name="download")

Django似乎正在保存文件的實例,但實際上并沒有存儲它。我需要配置nginx.conf來服務/media目錄中的文件還是做其他事情?任何幫助都將不勝感激。

Thanks

? 最佳回答:

通常,您必須配置nginx以代理將請求傳遞到media/和static/到您的django實例:

下面假設您的django服務可以在http://django:8000,但如果您沒有使用docker(并且它沒有命名為django),則更可能是這樣http://localhost:8000

    location /static {
        proxy_pass        http://django:8000;
        proxy_redirect    default;
        proxy_set_header  Host $host;
        proxy_set_header  X-Real-IP $remote_addr;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header  X-Forwarded-Host $server_name;
    }

    location /media {
        proxy_pass        http://django:8000;
        proxy_redirect    default;
        proxy_set_header  Host $host;
        proxy_set_header  X-Real-IP $remote_addr;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header  X-Forwarded-Host $server_name;
    }

另外,確保在調試模式下運行時(通常是本地開發人員)設置URL路由,以便django處理它們

if settings.DEBUG:
    from django.views.static import serve
    from django.conf.urls.static import static

    urlpatterns += [
        url(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT, 'show_indexes': True}),
    ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

主站蜘蛛池模板: 精品一区二区在线观看| 制服美女视频一区| 日韩一区二区在线观看| 国精产品一区二区三区糖心| 日韩一区二区视频在线观看| 日本免费电影一区二区| 亚洲免费视频一区二区三区| 午夜视频在线观看一区| 亚洲国产成人久久综合一区 | 亚洲熟女www一区二区三区| 久久影院亚洲一区| 一区三区三区不卡| 精品无码一区二区三区水蜜桃| 天堂一区人妻无码| 亚洲av乱码一区二区三区按摩| 国产99视频精品一区| 精品无码一区二区三区爱欲| 日韩人妻无码一区二区三区99 | 国产福利微拍精品一区二区| 久久一区二区精品| 久久精品一区二区三区日韩| 无码少妇一区二区三区浪潮AV| 成人乱码一区二区三区av| 久久99国产一区二区三区| 久久精品无码一区二区三区日韩 | 又硬又粗又大一区二区三区视频 | 国产AV午夜精品一区二区入口 | 亚洲一区二区三区免费观看| 日韩人妻无码一区二区三区久久| 久久久精品人妻一区二区三区 | 精品欧洲av无码一区二区14| 国产激情一区二区三区四区 | 天海翼一区二区三区高清视频 | 亚洲AV综合色一区二区三区 | 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 亚洲av乱码一区二区三区| 日本一区频道在线视频| 在线电影一区二区| 三上悠亚国产精品一区| 久久国产精品视频一区| 亚洲AV日韩AV一区二区三曲|