django 文件在本地打开但在服务器中失败

django file opens locally but fails in server

我想要实现的是让用户通过表单上传文件,比如个人资料图片, 我的目标是获取该文件,通过 imgbb 的 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 服务器上: 它returns

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 的限制?或者你能建议一个更好的方法来达到最终结果吗?

如有任何帮助,我们将不胜感激

pythonanywhere 的 StackTrace:

图片 link : 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