Python 3.6 Django 2.1.0 Sqlite 3.8.11 执行:python manage.py runserver 错误提示: Django.db.utils.NotSupportedError:URIs not supported 修改:/usr/local/python3/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py 159行前俩行 True改为:False 执行:python manage.py migrate ### Django配置详解与常见问题解决方法 #### 一、环境配置 在开发基于Django的Web应用时,首先需要确保开发环境已经正确安装了所需的软件版本。本案例中使用的是Python 3.6、Django 2.1.0以及SQLite 3.8.11。这些版本的选择对于确保应用程序兼容性和稳定性至关重要。 - **Python 3.6**: Python 3.6是Python 3系列中的一个稳定版本,提供了许多新特性如类型注解等,并且在性能上有所提升。 - **Django 2.1.0**: Django 2.1.0发布于2018年8月,这是一个长期支持版本,包含了大量的新特性和改进,例如对Python 3.7的支持、新的中间件类、增强的安全功能等。 - **SQLite 3.8.11**: SQLite是一个轻量级的关系型数据库管理系统,常用于Web开发中的测试环境或小型项目中。3.8.11版本是在2015年发布的稳定版本,包含了多项性能优化和bug修复。 #### 二、启动服务器遇到的问题及解决方案 在运行`python manage.py runserver`命令时,可能会遇到以下错误提示: ``` Django.db.utils.NotSupportedError: URIs not supported ``` 这个错误通常出现在使用SQLite作为数据库后端时尝试通过URI(统一资源标识符)形式来指定数据库连接字符串的情况下。SQLite不支持通过URI的方式来访问数据库文件。 ##### 解决方案 为了解决这个问题,可以修改Django的SQLite后端代码,具体来说是`/usr/local/python3/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py`文件中的第159行及其前两行。原始代码可能如下所示: ```python if uri: # Remove query string and fragment from URI uri = urlparse.urlunparse(urlparse.urlparse(uri)[:4] + (None, None)) info = urllib.parse.urlparse(uri) # Only file:// is supported; strip the prefix. if info.scheme != 'file': raise NotSupportedError("Only the file scheme can be used with SQLite") path = urllib.request.url2pathname(info.path)[1:] # Strip leading path separator # The path may be given as a relative URI, so we need to make it absolute. path = os.path.join(os.path.dirname(info.path), path) kwargs['database'] = path else: kwargs['database'] = settings.DATABASES[alias].get('NAME') if settings.DATABASES[alias].get('IS_MEMORY_DB', False): # Special-case for in-memory database kwargs['database'] = ':memory:' ``` 将其中的`settings.DATABASES[alias].get('IS_MEMORY_DB', True)`中的`True`改为`False`。这样做的目的是为了防止SQLite后端尝试解析URI,而直接使用标准的数据库路径字符串。 修改后的代码片段如下: ```python if uri: # Remove query string and fragment from URI uri = urlparse.urlunparse(urlparse.urlparse(uri)[:4] + (None, None)) info = urllib.parse.urlparse(uri) # Only file:// is supported; strip the prefix. if info.scheme != 'file': raise NotSupportedError("Only the file scheme can be used with SQLite") path = urllib.request.url2pathname(info.path)[1:] # Strip leading path separator # The path may be given as a relative URI, so we need to make it absolute. path = os.path.join(os.path.dirname(info.path), path) kwargs['database'] = path else: kwargs['database'] = settings.DATABASES[alias].get('NAME') if settings.DATABASES[alias].get('IS_MEMORY_DB', False): # 将此处的True改为False # Special-case for in-memory database kwargs['database'] = ':memory:' ``` 完成上述修改之后,再次运行`python manage.py migrate`命令,以更新数据库模式。 #### 三、最佳实践建议 虽然上述方法能够解决特定问题,但直接修改Django源码并不被推荐,因为这可能会导致未来升级Django版本时出现问题。更好的做法是调整`settings.py`中的数据库配置,例如使用文件路径而非URI形式: ```python DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } } ``` 这样不仅可以避免直接修改框架源码带来的问题,还能够让代码更加清晰易读。 在开发基于Django的Web应用时,确保正确的环境配置和遵循最佳实践是非常重要的。遇到类似问题时,应该优先考虑调整配置而不是直接修改框架代码。
- 粉丝: 0
- 资源: 3
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助