python遇见的错误提示

第一种:TypeError: an integer is required (got type str)

def send_msg(udp_scoket):
    '''发送信息'''
    dest_ip = input("请输入对方的IP地址:")
    dest_port = int(input("请输入对方的端口:"))
    send_data = input("请输入要发送的内容:")
    udp_scoket.sendto(send_data.encode('utf-8'),(dest_ip,dest_port))

这里端口号,在scoket中端口号一定要用数字,而在python中经过输入的字符全都是字符串,需要经过字符串转码,把str类型转成int类型

第二种:UnicodeDecodeError: 'utf-8' codec can't decode byte 0x84 in position 1: invalid start byte

这种是编码格式错误造成的



def rece_msg(udp_scoket):
    recv_data = udp_scoket.recvfrom(1024)
    print(recv_data)
    # print("%s:%s"%(str(recv_data[1]),recv_data[0].decode('utf-8')))

这里我们先把返回值给打印出来,(b'm;R\xa8V\xdeu5\x8b\xddv\x84V\xde\x8c\x03', ('127.0.0.1', 8877))

我们会看见数据是b'm;R,
备注:现在还没有找到解决办法

第三种:ConnectionRefusedError: [Errno 61] Connection refused

这个其实是粗心大意造成的,其实就是socket服务器没开,拒绝访问

第四种: t.start()
TypeError: start() missing 1 required positional argument: 'self'

import  threading
import time


class MyThread(threading.Thread):
    def run(self) -> None:
        for i in range(5):
            time.sleep(1)
            msg = "IM " +self.name +"@ "+ str(self)
            print(msg)


'''
注意这个扩展类的方法,只能创建一个线程,并不能创建多个线程

'''



if __name__ == "__main__":
    t = MyThread
    t.start()

请注意观察倒数第二行,我引用了类对象,但是没有添加括号,其实这个报错的就是初始化对象的时候要添加()

第四种:TypeError: a bytes-like object is required, not 'str',这种基本都是编码格式错误造成的,加上编码格式即可,例如:

new_scoket.send(response.encode('utf-8'))

Traceback (most recent call last):
  File "/Users/wangying/PycharmProjects/Web服务器/05_httpServer_Files.py", line 32, in 
    main()
  File "/Users/wangying/PycharmProjects/Web服务器/05_httpServer_Files.py", line 28, in main
    server_client(new_scoket)
  File "/Users/wangying/PycharmProjects/Web服务器/05_httpServer_Files.py", line 13, in server_client
    new_scoket.send(response)
TypeError: a bytes-like object is required, not 'str'

第五种错误:TypeError: cannot use a string pattern on a bytes-like object

出错的主要原因是因为:

     TypeError: can’t use a string pattern on a bytes-like object.

     html用decode(‘utf-8’)进行解码,由bytes变成string。

     py3的urlopen返回的不是string是bytes。
解决方法是:把’html’类型调整一下:html.decode(‘utf-8’),给解析的数据,添加个数据类型。

request = new_scoket.recv(1024).decode('utf-8')

第六种错误:由 try else except引起的:“SyntaxError: invalid syntax”。这是由于在python3.7中写的顺序错误导致的,在3.5中没事,3.7中需要先写try,在写except,再写else,记得else一定要写在except的后面


    try:
        print(file_name)
        f = open("/admin"+file_name,'rb')
    except:
        response = 'HTTP/1.1 200 OK\r\n'
        response += '\r\n'
        response += '------------- file  not  found ---------'
        new_scoket.send(response.encode('utf-8'))
    else:
        html_content = f.read()
        f.close()
        # 加\r\n两个,是由于windows与linuex系统里面的转义字符不一样造成的
        response = 'HTTP/1.1 200 OK\r\n'
        response += '\r\n'
        # 把response header发送回去
        new_scoket.send(response.encode('utf-8'))
        # 把response body发送出去
        new_scoket.send(html_content)


        print("返回的数据", response)
        print("返回的body", html_content)

        print("*" * 100)

第七种错误:在引用C语言动态文件时报错了,报错的内容
OSError: dlopen(./libdead_loop.so, 6): no suitable image found.  Did find:
  主要是我引用了windows中动态编辑后的文件造成的,其实就是您的python和调用的动态文件之间存在体系结构不匹配。使用file检查什么的架构调用的动态文件

解决办法:

直接使用mac终端再次生成下动态文件

/usr/local/bin/python3.7 /Users/wangying/PycharmProjects/Web服务器/main.py
Traceback (most recent call last):
  File "/Users/wangying/PycharmProjects/Web服务器/main.py", line 7, in 
    lib = cdll.LoadLibrary("./libdead_loop.so")
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ctypes/__init__.py", line 442, in LoadLibrary
    return self._dlltype(name)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ctypes/__init__.py", line 364, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: dlopen(./libdead_loop.so, 6): no suitable image found.  Did find:
	./libdead_loop.so: unknown file type, first eight bytes: 0x7F 0x45 0x4C 0x46 0x02 0x01 0x01 0x00
	/Users/wangying/PycharmProjects/Web服务器/libdead_loop.so: unknown file type, first eight bytes: 0x7F 0x45 0x4C 0x46 0x02 0x01 0x01 0x00

第八种错误:RecursionError: maximum recursion depth exceeded while calling a Python object

这个错误看字面意思就是:递归深度超出限制

这有两种,一种是自己写的代码进入死循环了,在反复递归,这时就需要查找原因,找到为什么会反复递归,下面的例子中的方法setMoney中self.money = value,就陷入了死循环,会反复递归

class Money(object):
    def __init__(self):
         self.__money = 0
    def getMoney(self):
        return self.__money
    def setMoney(self,value):
        if isinstance(value,int):
            '''
            这里需要特别注意,当我使用self.money时,其实我调用的是setMoney这个方法,进入了死循环
            '''
            # self.money = value
            #所以我们要使用__money
            self.__money = value
        else:
            print("error:不是整型数字")

    def delMoney(self):
        print("删除金额")
        del self.__money

    #定义个属性,当对这个Money设置值时调用setMoney,当获取值时调用getMoney
    money = property(getMoney,setMoney,delMoney,"商品售价")

a = Money()
print(a.money)
a.money = 100
print(a.money)
del a.money

第二种是我们真的需要深度递归,但是递归次数超出默认设置,python默认的递归深度是很有限的(默认是1000),因此当递归深度超过999的样子,就会引发这样的一个异常。

解决方法很简单,在代码头部加入:(修改递归深度的值,让它变大大一点)

import sys
sys.setrecursionlimit(1000000)

这样修改Python最大递归为100万次,根据个人需求设置次数。

第九种:

问题描述:
InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
InsecureRequestWarning)

这个是在https中禁用证书验证后提示的

解决:
禁用安全请求警告

  • 如果requests >= 2.16.0
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

第十种:

问题藐视:

ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1076)

During handling of the above exception, another exception occurred:

使用https,request要验证证书,

解决办法:verify=False

    response = requests.get(url,verify=False)
    print(response)

第十一种:

context must be a dict rather than RequestContext.这个是在Django使用 模板表的时候报的错误:

python遇见的错误提示_第1张图片

解决代码context直接等于参数,不需要再经过HttpRequest了

from django.shortcuts import render
from django.http import HttpResponse
from django.template import loader,RequestContext
# Create your views here.

def my_render(request,template_path,context_dict={}):
    temp = loader.get_template(template_path)
    # context = RequestContext(request, context_dict)
    context = context_dict #最新的Django2.0以上,直接这样写
    res_html = temp.render(context)
    return HttpResponse(res_html)

#定义视图函数,HttpRequest
# http://127.0.0.1:8000/index
def index(request):
    # return HttpResponse('djdjdjdjdjdjjd')
    return my_render(request,'book/index.html',{})

第十二种:_禁止访问 _CSRF验证失败. 

在Django开发时访问一个url时,回有一个注册页面的响应,输入对应的信息后,单击注册按钮进行提交进行页面跳转,显示禁止访问 _CSRF验证失败. 请求被中断_更多信息请设置选项DEBUG=True。

python遇见的错误提示_第2张图片

最简单也最不安全的办法

将settings.py文件的MIDDLEWARE中的csrf设置注掉后,再次运行,问题解决。

第十三种:在Django中template遇到

Exception Type: TypeError at /index
Exception Value: context must be a dict rather than RequestContext.、

原代码

# 使用模板文件
# 1.加载模板文件,获取一个模板文件
temp = loader.get_template('booktest/index.html')
 
# 2.定义模板上下文:给模板文件传递数据
context = RequestContext(request, {})
 
# 3.模板渲染:产生标准的html内容
res_html = temp.render(context)
 
# 4.返回给浏览器
return HttpResponse(res_html)

正确的代码

# 1.加载模板文件
temp = loader.get_template('booktest/index.html')
 
# 2.定义模板上下文:给模板文件传递数据
context =  RequestContext(request, {})
context.push(locals())
 
# 3.模板渲染:产生标准的html内容
res_html = temp.render(context=locals(), request=request)
 
# 4.返回给浏览器
return HttpResponse(res_html)

 

 

 

你可能感兴趣的:(python3)