第一种: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使用 模板表的时候报的错误:
解决代码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。
最简单也最不安全的办法
将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)