我最近升级了 Django 4.2,并对我的项目应用存储更改。 存储模块遇到导入错误。
我的导入代码
from django.core.files.storage import storages
我遇到的错误是
error: Module 'django.core.files.storage' has no attribute 'storages'
我仔细检查了软件包版本。 我尝试重新安装要求。 pycharm 和 mypy 都向我抛出了错误。 我尝试在 shell 中导入该模块,效果很好。
有谁知道为什么会这样?
看起来这是因为(闭源)PyRight 扩展附带了 Django 过时的类型存根:
$ cat ~/.vscode/extensions/ms-python.vscode-pylance-2024.6.1/dist/bundled/stubs/django-stubs/core/files/storage.pyi
from datetime import datetime
from typing import IO, Any
from django.core.files.base import File
from django.utils.functional import LazyObject
class Storage:
def open(self, name: str, mode: str = ...) -> File: ...
def save(
self, name: str | None, content: IO[Any], max_length: int | None = ...
) -> str: ...
def get_valid_name(self, name: str) -> str: ...
def get_available_name(self, name: str, max_length: int | None = ...) -> str: ...
def generate_filename(self, filename: str) -> str: ...
def path(self, name: str) -> str: ...
def delete(self, name: str) -> None: ...
def exists(self, name: str) -> bool: ...
def listdir(self, path: str) -> tuple[list[str], list[str]]: ...
def size(self, name: str) -> int: ...
def url(self, name: str) -> str: ...
def get_accessed_time(self, name: str) -> datetime: ...
def get_created_time(self, name: str) -> datetime: ...
def get_modified_time(self, name: str) -> datetime: ...
class FileSystemStorage(Storage):
OS_OPEN_FLAGS: int = ...
def __init__(
self,
location: str | None = ...,
base_url: str | None = ...,
file_permissions_mode: int | None = ...,
directory_permissions_mode: int | None = ...,
) -> None: ...
@property
def base_location(self) -> str: ...
@property
def location(self) -> str: ...
@property
def base_url(self) -> str: ...
@property
def file_permissions_mode(self) -> int | None: ...
@property
def directory_permissions_mode(self) -> int | None: ...
class DefaultStorage(LazyObject): ...
default_storage: Storage
def get_storage_class(import_path: str | None = ...) -> type[Storage]: ...
如果我在该文件中添加
"storages"
常量,错误就会消失。