Файл django открывается локально, но не открывается на сервере
Я хочу добиться того, чтобы пользователь загружал файл через форму, скажем, фотографию профиля,
Моя цель - взять этот файл, отправить его через imgbb's api и получить url изображения, чтобы сохранить его для использования в моем шаблоне позже.
Я смог добиться этого с помощью приведенного ниже кода, который работает локально (Windows), но как только я перехожу на свой рабочий сервер (в данном случае pythonanywhere), код не работает.
# CODE:
def testingpage(request):
image = ''
url = ''
if request.method == 'POST':
pic = request.FILES['image']
url = upload_to_bb(request, pic)
if url is not None:
from django.contrib import messages
messages.info(request, 'Uploaded Successfully')
return render(request, 'test.html', {'image': url})
def upload_to_bb(request, pic):
import os
from django.conf import settings
from django.core.files.storage import FileSystemStorage
import base64
import requests
base_url = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
fs = FileSystemStorage()
filename = fs.save(pic.name, pic)
file_path = f'{base_url}\media\{filename}'
apikey = settings.IMGBB_API_KEY
with open(file_path, "rb") as file:
url = "https://api.imgbb.com/1/upload"
payload = {
"key": apikey,
"image": base64.b64encode(file.read()),
}
r = requests.post(url, payload)
js = r.json()
if r.status_code == 200:
data = js['data']
file.close()
os.remove(file_path)
return data['image']['url']
else:
file.close()
os.remove(file_path)
from django.core.exceptions import ValidationError
raise ValidationError("An error occurred processing the image")
return None
виновником является эта строка кода
file_path = f'{base_url}\media\{filename}'
На локальном сервере windows: Возвращается
C:\Users\Sammy\PycharmProjects\kegites\media\WIN_20211209_15_41_37_Pro.jpg
на pythonanywhere, я получаю ошибку:
FileNotFoundError at /
[Errno 2] No such file or directory: '/home/kegitesclub/kegites\\media\\WIN_20211209_15_41_36_Pro_3afnrPi.jpg'
на heroku, я получаю:
No such file or directory: '/app\\media\\WIN_20211209_15_41_37_Pro.jpg'
Связано ли это с linux, что это серверы, или это что-то другое, возможно ограничение Django? Или вы можете предложить лучший подход для достижения конечного результата?
Любая помощь будет оценена по достоинству
StackTrace для pythonanywhere:
Ссылка на изображение : https://i.stack.imgur.com/quXPI.png
попробуйте заменить эту строку на эту
file_path = f'{base_url}\media\{filename}'
на это
file_path = f'{base_url}/media/{filename}'
и протестируйте его на сервере
Если вам нужно иметь пути, не зависящие от системы (между средами Windows и Linux), используйте os.path.join
или еще лучше pathlib
для их построения.
file_path = os.path.join(base_url, 'media', filename)
или в случае pathlib
base_url = pathlib.Path(__file__).resolve().parent.parent
и тогда
file_path = base_url / 'media' / filename