四方显神

导航

项目零星报错记录

1.href相对路径的使用

html页面经常有href相对路径的使用,例如:

<li><a href="/page/books?page={{ foo }}">{{ foo }}</a></li>
<li><a href="page/books?page={{ foo }}">{{ foo }}</a></li>

这里,

相对路径带斜杠时,表示该路径为当前资源路径的一个子路径,会在我们当前访问的路径后拼接这个href:http://127.0.0.1:8000/page/books/page/books/?page=10

相对路径带斜杠时,表示该路径根路径的一个子路径,所以就是:http://127.0.0.1:8000/page/books/?page=1

2.使用postman发送POST请求的时候报403 forbidden错

这节我遇到了一个错误,我使用postman发送POST请求的时候报403 forbidden错,参考了博客:Django CSRF cookie not set.错误 - 蜗牛findbug - 博客园 (cnblogs.com)  ,代码里加上了红色框框部分,解决了这个问题:

1
2
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt

这个问题是解决跨域请求,不建议使用这个注解绕过机制,我找了好久更好的解决方法也没有找到。

关于跨域问题可以参考:

Django Django中的@csrf_exempt是什么|极客教程 (geek-docs.com) 

一招彻底解决Django跨域请求问题_django转发请求-CSDN博客

我觉得应该是我postman没有配置好出现了这个问题,但是postman发送get请求就没有这个问题。暂时我还没有找到postman改哪里可以不这样。

2023.12.20更新:

这个问题还可以有另一种解决方案,就是settings.py中有个中间件,对post请求做了一个拦截,注掉就可以了:

2023.12.26更新:更好的解决方法:

前端页面 {% csrf_token %}自动生成token

还有一个<input type="hidden"> 这个type除了text和password还可以是hidden,隐藏这个键值对。

3.Python3出现“No module named 'MySQLdb'“问题-以及使用PyMySQL连接数据库

Python3 与 Django 连接数据库,出现了报错:Error loading MySQLdb module: No module named 'MySQLdb'。原因如下: 在 python2 中,使用 pip install mysql-python 进行安装连接MySQL的库,使用时 import MySQLdb 进行使用; 在 python3 中,改变了连接库,改为了 pymysql 库,使用pip install pymysql 进行安装,直接导入即可使用; 但是在 Django 中, 连接数据库时使用的是 MySQLdb 库,这在与 python3 的合作中就会报以下错误了:

django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named 'MySQLdb'

解决方法:在 __init__.py 文件中添加以下代码即可

4.Django3版本模型类中关于枚举类型的字段定义方法 

class Status(models.TextChoices):
    UNPUBLISHED = 'UN', 'Unpublished'
    PUBLISHED = 'PB', 'Published'


class Book(models.Model):
    status = models.CharField(
        max_length=2,
        choices=Status.choices,
        default=Status.UNPUBLISHED,
    )


class Pamphlet(models.Model):
    status = models.CharField(
        max_length=2,
        choices=Status.choices,
        default=Status.PUBLISHED,
    )  

参考:为什么Django 3后建议使用Field.choices枚举类型定义choices选项 - 知乎 (zhihu.com)

5. APIView.as_view() takes 1 positional argument but 2 were given

是路径写错,应该使用as_view()而不是as_view 

6.Cannot call `.is_valid()` as no `data=` keyword argument was passed when .... 

这个问题是出现在DRF组件反序列化的时候,在Django开发笔记(13)里也有提了一嘴在哪里出现的问题。原因是写这一句:serializer = self.get_serializer(data = request.data) ,不能写成serializer = self.get_serializer(request.data) 。

7.js调用函数加括号和不加括号的区别:

 我是想做一个定时器案例,下面是正确的代码,有个关于加不加括号的思考,因为这个加了括号就跳不动了,不加括号才可以跳。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>定时器案例</title>


    <script>
        function setTime(){
             var now = new Date();
                var now_str = now.toLocaleString(); //toLocaleString() 根据本地时间把Date对象转换为字符串
                console.log(now_str)

                // 通过document获取标签
                var element = document.getElementById("time_input");
                console.log(element);
                element.value = now_str; //这是属性不是方法,是给属性赋值
        }

        function start() {
            setTime();
            window.setInterval(setTime, 1000) //这里为什么不用setTime(),调用函数不用加括号吗,那上面那句为什么加括号
        }

        function end(){

        }

    </script>


</head>
<body>
<input type="text" value="" id="time_input"> <button onclick="start()">start</button><button onclick="end()">end</button>

</body>
</html>

带括号:只要是调用函数进行执行的,都带括号。返回的结果是返回值或者执行结果。当然,有些没有返回值,但已经执行了函数体内的行为,就是说,加括号的,就代表将会执行函数体代码

不带括号:不加括号的,都是把函数名称作为函数的指针,一个函数的名称就是这个函数的指针,此时不是得到函数的结果,因为不会运行函数体代码。它只是传递了函数体所在的地址位置,在需要的时候好找到函数体去执行。

        function sayHello() {

            alert('hello')

        }
        console.log(sayHello); //这样只会打印function sayHello() 空函数,不会弹出hello



        function sayHello() {

            alert('hello')

        }
        console.log(sayHello());// 这样就会弹出hello

8. AttributeError: module 'collections' has no attribute 'Callable' 【已解决】

项目环境是python3.11,深度学习的时候遇到的,

报错节选:

AttributeError: module 'collections' has no attribute 'Callable'

Process finished with exit code 1

Empty suite

我将最后一个报错文件中所有出现collections的地方都改成了collections.abc,就没事了。

参考:https://blog.csdn.net/weixin_44796285/article/details/127577058

9.AttributeError: module 'backend_interagg' has no attribute 'FigureCanvas'【已解决】

深度学习的时候遇到的,解决方式: 

方法1 添加两行代码
import matplotlib
matplotlib.use('TkAgg')
方法2
安装matplotlib3.5.0版本及其以下的
pip install matplotlib==3.5.0

参考:https://blog.csdn.net/qlkaicx/article/details/134068734

10.ValueError: not enough values to unpack【已解决】

出现在深度学习 函数返回值只有两个,却用三个变量接收。

x, y, coef = create_dataset()

11. plt.title函数设置中文标题,遇到中文不显示或者乱码问题【已解决】

出现在深度学习,绘制损失函数的时候。

解决方式1:(亲测好用)

修改matplotlib的rcParams:

可以通过修改matplotlib的rcParams来设置全局字体,确保中文能够正确显示。例如:

plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置非中文字体为SimHei
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像时负号'-'显示为方块的问题

解决方式2:(没有尝试)

编辑matplotlibrc文件:

进入Python,找到matplotlib所在路径,然后编辑matplotlibrc文件,修改或添加字体设置。具体步骤包括找到font.familyfont.sans-serifaxes.unicode_minus等选项,并进行相应的设置。最后,删除\~/.matplotlib目录下的两个文件并重启Python,以使更改生效。

12.Error: Django is not importable in this environment

这个问题是我电脑盘坏了重配所有东西后pycharm启动Django项目发现的。

解决方法:pycharm编译器,点file—>settings—>Project Interpreter,重新选择可用的python版本即可

13:使用JsonResponse时,报Object of type QuerySet is not JSON serializable。

需求背景:

ajax返回数据库所有数据,并用列表显示。

views.py中使用JsonResponse返回回调后的数据。总是会报错:

Object of type QuerySet is not JSON serializable。

查阅了一下JsonResponse需要的参数是字典,列表等。只需要将querySet转换为字典即可。

要将Queryset转换为字典,我们可以使用Django内置的方法values()或values_list()。values()返回一个包含字段和值的字典对象的Queryset列表,而values_list()返回一个包含元祖的Queryset列表。

如何将Queryset转换为字典:

def diffAnalysisResult(request):
    print(request.POST)  # <QueryDict: {'geneinput': ['AL078581.2']}>
    symbol = request.POST.get("geneinput")
    result = DiffAnalysisTable.objects.filter(symbol=symbol).values()
    result_list = list(result)
    print(JsonResponse(result_list))
    return JsonResponse({'diff_return': result})

 14.MIME 类型(“text/html”)不匹配(X-Content-Type-Options: nosniff

html里少加了一个form标签,加上就好了。全网这个报错我都没看明白,可能好多奇奇怪怪的都能报这个吧,不太懂。

15.You cannot initialize the table more than once!

ajax+bootstraptable展示数据的时候,无法根据需求更改展示内容,报错:You cannot initialize the table more than once!

解决方案:

加一行代码,先将bootstraptable销毁

$("#tool1table").bootstrapTable('destroy');

<script>
    $("#tool1btn").click(function () {

        if ($("#tool1select_gene").val() == "" && $("#tool1select_disease").val() == "") {
            alert("Please select a dataset or gene name for analysis.")
        } else {
            $.ajax({
                type: 'POST',
                dataType: 'json',
                data: {
                    symbol: $("#tool1select_gene").val(),
                    disease: $("#tool1select_disease").val()
                },
                url: '/cuDB/analysis/differential/result',
                success: function (diff_return) {
                    const return_data = JSON.parse(JSON.stringify(diff_return));
                    $("#tool1table").bootstrapTable('destroy');
                    {#$("#tool1table").bootstrapTable('refresh'); //亲测重新刷新不可以,只能销毁 #}
                    $("#tool1table").bootstrapTable({
                        columns: [{
                            field: 'symbol',
                            title: 'Symbol',
                            sortable: true
                        }, {
                            field: 'disease',
                            title: 'Disease',
                            sortable: true
                        }, {
                            field: 'log_fc',
                            title: 'logFC',
                            sortable: true
                        }, {
                            field: 'p_value',
                            title: 'p value',
                            sortable: true
                        },
                            {
                                field: 'rid',
                                title: 'More<br>Details',
                                align: 'center',
                                {#formatter: detailFormatter,#}
                            },
                        ],
                        data: return_data,
                    });
                },
                error: function () {
                    console.log("出问题咯error")
                }
            });
        }
    });
</script>

16:UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xa1 in position 0: invalid start byte

在使用Python处理文本数据时,UnicodeDecodeError是一个相对常见的问题,它通常发生在尝试将字节序列解码为“utf-8”字符串时,但遇到了无法识别的字节。

参考:https://blog.csdn.net/FMC_WBL/article/details/136124112

解决方法

使用chardet库检测编码:chardet是一个非常有用的第三方库,可以帮助你检测未知编码的文本数据。首先安装chardet:

pip install chardet

然后使用chardet来检测文件编码:

    import chardet
     
    with open('example.txt', 'rb') as f:
        result = chardet.detect(f.read())
        encoding = result['encoding']
        print("Detected encoding:", encoding)

使用检测到的编码重新读取文件:根据chardet检测到的编码来读取文件:

    with open('example.txt', 'r', encoding=encoding) as f:
        content = f.read()
        print(content)

处理特定编码的数据:如果已知数据使用特定编码(例如GB2312、ISO-8859-1等),直接在读取数据时指定该编码:

    with open('example.txt', 'r', encoding='gb2312') as f:
        content = f.read()

17.URI is not registered (Settings | Languages & Frameworks | Schemas and DTDs)【已解决】

URI is not registered 错误通常是由于 IDEA 无法找到引用的 Schema 或 DTD,原因主要有二:

  1. 引用的 URI 有误,无法访问,建议仔细检查 URI
  2. 引用的 URI 未在 IDEA 中注册。

如果是原因2.可以使用两种方式解决:

方式1:在 IDEA 打开 File --> Settings- -> Languages & Frameworks -->Schemas and DTDs,将标红的 URI 添加到 Ignored schemas and DTDs 中,保存即可完成注册。

方式2:借助IDEA快捷注册,将光标放到标红 URI 所在行,点击左侧出现的小红灯泡,选择 Fetch external resource 即可。

参考:https://blog.csdn.net/qq_45256357/article/details/140007538

18.项目调用其他接口生成一个svg文件,这个文件在外部其他接口直接运行生成就不报错,但是使用Python调用别人的接口生成的文件就报错。(未解决)

后来检查了两种方法生成的文件,发现可能是编码问题:

 19.NotImplementedError:    

Conversion rules for `rpy2.robjects` appear to be missing. Those    rules are in a Python `contextvars.ContextVar`. This could be caused    by multithreading code not passing context to the thread.    Check rpy2's documentation about conversions.

NotImplementedError 的间歇性出现通常与以下因素有关:

  1. 多线程/异步环境:如果在多线程或异步代码中调用 generate_r_plot,可能导致上下文丢失,导致不一致的行为。

  2. 上下文管理:在某些情况下,未正确管理上下文会导致错误。例如,某些线程可能没有访问到正确的上下文变量。

  3. R 和 rpy2 版本兼容性:不同版本之间的兼容性问题可能导致间歇性的错误。某些函数在不同版本下的实现可能不同。

  4. 变量的生命周期:确保在使用之前,所有传递给 globalenv 的变量都是有效的。如果变量在某个线程中被修改或失效,可能会导致错误。

  5. 运行环境:在不同的环境(如 Jupyter Notebook 和标准 Python 脚本)中,行为可能会有所不同。

但是我尝试了使用上下文管理器,依然没有解决。

最终我将rpy2版本降级为3.5.1,解决了这个问题。

版本降级方法:

  1. 查看当前版本:
    1
    2
    import rpy2
    print(rpy2.__version__)
  2. 我的当前版本是3.5.16,我要降级为3.5.1。
    • 打开 PyCharm,然后打开项目。

    • 转到 "File" 菜单,选择 "Settings"(对于 macOS 用户,选择 "PyCharm" 菜单中的 "Preferences")。

    • 在设置或首选项窗口中,选择 "Project: 项目名称",然后点击 "Project Interpreter" 下拉菜单。

    • 在下拉菜单中,看到当前项目关联的解释器列表。选择想要从中改变版本 rpy2 的解释器,双击。

    • 这个时候打开一个新窗口。选择特殊版本,选到3.5.1.

       然后左下角install package。

    • 依次ok。

    注意:版本降级之后,可能还会出下面的错误16,再解决一下就好。

20.ztree和bootstraptable一起使用,导致bootstraptable无法正常显示问题

这里是引用比较混乱。要注意,每个js不要重复引用,我重复引用jquery,还导致了$table.bootstrapTable is not a function这个错。

这里,想要两个都显示正常,bootstraptable的js要在ztree的js之前加载。

最终我发现ztree和Datatable组合使用比和bootstraptable好解决,可能是datatable我用起来比较好用,我就把所有表格都换成datatable了。

21.pycharm下载包出现问题

终端pip下载requests包明明下载成功了,运行代码的时候还是显示‘’ModuleNotFoundError: No module named 'requests'”,最终参考 https://blog.csdn.net/qq_43267113/article/details/132913599

使用File-Setting,点击加号搜索要安装的包即可:

 

posted on 2023-12-25 16:11  szdbjooo  阅读(20)  评论(0)    收藏  举报