Django3.0+Python3.8+MySQL8.0 个人博客搭建二十一|天坑合集

文章目录

  • 一、makemigrations的坑
  • 二、`django-haystack`全文检索的坑
    • 1、`HAYSTACK`配置问题
      • 原因
      • 解决方法
      • 参考文章
    • 2、`six`模块找不到
      • 原因
      • 解决方法
      • 参考文章
    • 3、`python_2_unicode_compatible`在`django.utils.encoding`无法找到
      • 原因
      • 解决方法
    • 4、新增危险语法警告功能
      • 原因
      • 解决方法
    • 5、cryptography未安装
      • 原因
      • 解决方法
      • 参考文章
    • 6、找不到`haystack`
      • 报错
      • 原因
      • 参考文章
      • 报错
      • 原因
      • 解决方法
  • 三、其他坑
    • 1、include方法参数问题
      • 原因
      • 解决方法
      • 参考文章
    • 2、staticfiles被Django2.x及以上版本移除
      • 原因
      • 解决方法
      • 参考文章
    • 3、端口被占用
      • 原因
      • 解决方法
        • 方法一
        • 方法二
      • 参考文章
    • 4、
      • 原因
      • 解决方法
  • 教程目录

一、makemigrations的坑

Django3.0+Python3.8+MySQL8.0 个人博客搭建五|makemigrations连接MySQL数据库的坑

Django3.0+Python3.8+MySQL8.0 个人博客搭建七|makemigrations创建数据库的坑(第二弹)

二、django-haystack全文检索的坑

1、HAYSTACK配置问题

django.core.exceptions.ImproperlyConfigured: The HAYSTACK_CONNECTIONS setting is required.

原因

未配置HAYSTACK

解决方法

settings.py

# 全文搜索应用配置
HAYSTACK_CONNECTIONS = {
    'default': {
        'ENGINE': 'fswy.whoosh_cn_backend.WhooshEngine',  # 选择语言解析器为自己更换的结巴分词
        'PATH': os.path.join(BASE_DIR, 'whoosh_index'),  # 保存索引文件的地址,选择主目录下,这个会自动生成
    }
}
# 自动更新索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

参考文章

django-haystack全文检索详细教程

Haystack入门教程

2、six模块找不到

ImportError: cannot import name 'six' from 'django.utils'

原因

The Django 3.0.0 release notes specify that certain private Python 2
compatibility APIs were removed. Among those was django.utils.six.

Django 3.0.0发布说明指定删除了某些专用的Python 2兼容性api。其中包括django.utils.six

解决方法

  1. $ pip3 install six
  2. 进入/Users/xiatian/fswy/blog/venv/lib/python3.8/site-packages
  3. six.py 复制到 /Users/xiatian/fswy/blog/venv/lib/python3.8/site-packages/django/utils即可

参考文章

Django测试开发-16-ImportError: cannot import name ‘six’ from ‘django.utils’

ImportError: cannot import name ‘six’ from ‘django.utils’

3、python_2_unicode_compatibledjango.utils.encoding无法找到

File "/Users/xiatian/fswy/blog/venv/lib/python3.8/site-packages/haystack/inputs.py", line 8, in <module>
  from django.utils.encoding import force_text, python_2_unicode_compatible
ImportError: cannot import name 'python_2_unicode_compatible' from 'django.utils.encoding' (/Users/xiatian/fswy/blog/venv/lib/python3.8/site-packages/django/utils/encoding.py)

原因

还是six在django3.0中被移除的问题

解决方法

进入/Users/xiatian/fswy/blog/venv/lib/python3.8/site-packages/haystack/inputs.py文件中

请使用

from six import python_2_unicode_compatible

替代

from django.utils.encoding import python_2_unicode_compatible

在这里插入图片描述

4、新增危险语法警告功能

/Users/xiatian/fswy/blog/apps/fswy/whoosh_cn_backend.py:618: SyntaxWarning: "is" with a literal. Did you mean "=="?

原因

新增危险语法警告功能

Python有一个SyntaxWarning功能,可以警告不是SyntaxError的可疑语法。

Python 3.8添加了一些新功能,可以在编码和调试过程中为你提供帮助。

is==之间的区别可能会造成混淆。后者用于检查是否有相等的值,而只有在对象相同时才为true

Python 3.8将在应该使用==而不是is时发出警告:

>> # Python 3.7 
>> version = "3.7"
>> version is "3.7"
False
>> # Python 3.8
>> version = "3.8"
>> version is "3.8"
<stdin>:1: SyntaxWarning: "is" with a literal. Did you mean "=="?
False
>> version == "3.8"
True

解决方法

进入

/Users/xiatian/fswy/blog/apps/fswy/whoosh_cn_backend.py

将第618行代码

 if value is None or len(value) is 0:

改为

if value == None or len(value) == 0:

5、cryptography未安装

raise RuntimeError("cryptography is required for sha256_password or caching_sha2_password")

原因

Pycharm连接数据库出现

解决方法

安装cryptography

$ pip3 install cryptography

参考文章

RuntimeError: cryptography is required for sha256_password or caching_sha2_password

6、找不到haystack

ModuleNotFoundError: No module named 'haystack'

这个问题搞了我好久,因为最开始是直接在PyCharm中直接安装的django-haystack,但是在终端$ python3 manage.py rebuild_index建立索引的时候,一直报这个错误,硬是没找到思路。

找了半天解决方案,
第一种:

$ pip3 install haystack

再运行rebuild_index

报错

ImportError: cannot import name 'connections' from 'haystack' (/Users/xiatian/fswy/lib/python3.8/site-packages/haystack/__init__.py)

原因

haystackdjango-haystack,这两个包有冲突.

网上的方法都只是删除了haystack,但还是报错

我的解决方法是:

pip uninstall haystack
pip uninstall django-haystack
pip install django-haystack

参考文章

ImportError: cannot import name ‘connections’ from ‘haystack’

再运行rebuild_index

报错

raise MissingDependency("The 'whoosh' backend requires the installation of 'Whoosh'. Please refer to the documentation.")

原因

这里很简单就是没有安装whoosh

解决方法

$ pip3 install whoosh

再运行rebuild_index

(fswy) blog xiatian$ python3 manage.py rebuild_index 
WARNING: This will irreparably remove EVERYTHING from your search index in connection 'default'.
Your choices after this are to restore from backups or rebuild via the `rebuild_index` command.
Are you sure you wish to continue? [y/N] y
Removing all documents from your index because you said so.
All documents removed.
Indexing 2 文章
Building prefix dict from the default dictionary ...
Loading model from cache /var/folders/7d/s7t1kh7n4x59zqltw7gs26640000gn/T/jieba.cache
Loading model cost 0.745 seconds.
Prefix dict has been built successfully.

总结一下,就是要在终端中安装django-haystack!

三、其他坑

1、include方法参数问题

File "/Users/xiatian/fswy/blog/blog/urls.py", line 24, in <module>
    path('', include('fswy.urls', namespace='blog'))
  File "/Users/xiatian/fswy/blog/venv/lib/python3.8/site-packages/django/urls/conf.py", line 38, in include
    raise ImproperlyConfigured(
django.core.exceptions.ImproperlyConfigured: Specifying a namespace in include() without providing an app_name is not supported. Set the app_name attribute in the included module, or pass a 2-tuple containing the list of patterns and app_name instead.

原因

查找错误出处,为conf.py文件
源代码如下:

def include(arg, namespace=None):
    app_name = None
    if isinstance(arg, tuple):
        # Callable returning a namespace hint.
        try:
            urlconf_module, app_name = arg
        except ValueError:
            if namespace:
                raise ImproperlyConfigured(
                    'Cannot override the namespace for a dynamic module that '
                    'provides a namespace.'
                )
            raise ImproperlyConfigured(
                'Passing a %d-tuple to include() is not supported. Pass a '
                '2-tuple containing the list of patterns and app_name, and '
                'provide the namespace argument to include() instead.' % len(arg)
            )
    else:
        # No namespace hint - use manually provided namespace.
        urlconf_module = arg
 
    if isinstance(urlconf_module, str):
        urlconf_module = import_module(urlconf_module)
    patterns = getattr(urlconf_module, 'urlpatterns', urlconf_module)
    app_name = getattr(urlconf_module, 'app_name', app_name)
    if namespace and not app_name:
        raise ImproperlyConfigured(
            'Specifying a namespace in include() without providing an app_name '
            'is not supported. Set the app_name attribute in the included '
            'module, or pass a 2-tuple containing the list of patterns and '
            'app_name instead.',
        )
    namespace = namespace or app_name
    # Make sure the patterns can be iterated through (without this, some
    # testcases will break).
    if isinstance(patterns, (list, tuple)):
        for url_pattern in patterns:
            pattern = getattr(url_pattern, 'pattern', None)
            if isinstance(pattern, LocalePrefixPattern):
                raise ImproperlyConfigured(
                    'Using i18n_patterns in an included URLconf is not allowed.'
                )

include()函数可以看出来,这个函数有两个参数,一个arg,一个namespace,我在代码中也是两个参数,但是异常中提示了,没有提供app_name,还提示需要传入一个两元元组,从第六行代码

urlconf_module, app_name = arg

可以看出来,arg就是那个元组,且给app_name赋值了

解决方法

path('', include('fswy.urls', namespace='blog'))

改为

path('', include(('fswy.urls', "fswy"), namespace="blog")),

参考文章

Django2.0异常:Specifying a namespace in include() without providing an app_name is not supported.

2、staticfiles被Django2.x及以上版本移除

'staticfiles' is not a registered tag library. Must be one of: admin_list admin_modify admin_urls cache i18n imagekit l10n log static tz

原因

{% load staticfiles %}{% load adminstatic %}已经在Django 2.1Django 3.0中移除。

解决方法

如果你要在你的HTML页面中用下面的代码

{% load staticfiles %}

{% load static from staticfiles %}

{% load adminstatic %}

你必须用下面的代码代替(仅所有.html文件)

{% load static %}

参考文章

TemplateSyntaxError - ‘staticfiles’ is not a registered tag library. Must be one of:

3、端口被占用

Django3.0+Python3.8+MySQL8.0 个人博客搭建二十一|天坑合集_第1张图片

Error: That port is already in use.

原因

8000端口已被占用

解决方法

有两个方法可以解决(假设8000端口被占用):

方法一

使用python manage.py runserver 8001开一个新的端口。

方法二

  1. kill掉原来的端口(在root条件下)。
  2. 在终端输入lsof -i:8000,列出进程信息。
  3. 然后,找到进程的PID号,比如我的PID号就是92934。
  4. 输入kill -9 PID,比如kill -9 92934就可以关闭该端口了。
  5. 使用python manage.py runserver 就能继续使用8000端口了。
    在这里插入图片描述

参考文章

解决Django-Error: That port is already in use

4、

Invaild block tag on line 12:'xxxxx',expected 'endblock'. Did you forget to register or load this tag?

Django3.0+Python3.8+MySQL8.0 个人博客搭建二十一|天坑合集_第2张图片

原因

这类问题都基本是’xxxxx’方法写错了,或者是引用出问题

解决方法

  1. 进入对应文件查看方法是否写错
  2. 查看是否引用对应方法的文件

教程目录

Django3.0+Python3.8+MySQL8.0 个人博客搭建一|前言
Django3.0+Python3.8+MySQL8.0 个人博客搭建二|创建虚拟环境
Django3.0+Python3.8+MySQL8.0 个人博客搭建三|创建博客项目
Django3.0+Python3.8+MySQL8.0 个人博客搭建四|创建第一个APP
Django3.0+Python3.8+MySQL8.0 个人博客搭建五|makemigrations连接MySQL数据库的坑
Django3.0+Python3.8+MySQL8.0 个人博客搭建六|数据库结构设计
Django3.0+Python3.8+MySQL8.0 个人博客搭建七|makemigrations创建数据库的坑(第二弹)
Django3.0+Python3.8+MySQL8.0 个人博客搭建八|通过admin管理后台
Django3.0+Python3.8+MySQL8.0 个人博客搭建九|博客首页开发(一)
Django3.0+Python3.8+MySQL8.0 个人博客搭建十|整理项目结构
Django3.0+Python3.8+MySQL8.0 个人博客搭建十一|博客首页开发(二)
Django3.0+Python3.8+MySQL8.0 个人博客搭建十二|博客首页开发(三)
Django3.0+Python3.8+MySQL8.0 个人博客搭建十三|博客详情页面
Django3.0+Python3.8+MySQL8.0 个人博客搭建十四|注册登录
Django3.0+Python3.8+MySQL8.0 个人博客搭建十五|评论区
Django3.0+Python3.8+MySQL8.0 个人博客搭建十六|网站地图
Django3.0+Python3.8+MySQL8.0 个人博客搭建十七|Haystack 全文搜索
Django3.0+Python3.8+MySQL8.0 个人博客搭建十八|功能完善
Django3.0+Python3.8+MySQL8.0 个人博客搭建十九|RESTful API接口
Django3.0+Python3.8+MySQL8.0 个人博客搭建二十|RSS订阅

你可能感兴趣的:(#)