以下為我編程期間遇到的錯誤並進行記錄,起始時間2017-6-21
時間:2020/01/03
問題現象:在django中單獨運行腳本提示沒有環境變量
錯誤提示:django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
解決示例代碼如下:
if __name__ == "__main__":
#設置環境變量,默認環境變量存儲在django項目的manage.py中
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CrazyEye.settings")
#加載app
import django
django.setup()
#這里要最后載入運行的模塊
from backend import main
obj = main.HostManager()
obj.interactive()
時間:2018/11/21
問題現象:ajax 執行異步提交后,在訪問日志看出現了2次post執行
分析:默認ajax提交是執行一次,然后獲取返回結果,出現了2次應該在模板里還會有一次提交。
解決:仔細查看前端執行ajax提交功能的按鍵button,發現button標簽寫的有問題:
<button type="submit" class="btn btn-primary" onclick="SavePassword()">Save changes</button>
這里 type="submit" 就是問題根本,在執行ajax后會再次執行submit,所以會出現2次提交,把submit修改為button后問題解決。
時間:2018/8/13
錯誤提示:TypeError: the JSON object must be str, not 'bytes'
出現場景:通過request.put提交修改數據到服務器端,客戶端python版本:3.6.1,服務端版本:3.5.3版本,django版本:1.11,服務器端通過json.loads(request.body)接收數據進行loads提示以上錯誤。
解決:request.body.decode('utf-8')將bytes類型轉換為str類型。解決。
另:我在python3.6.1本機測試未使用轉碼沒有提示錯誤。
----------------------------------------
Exception happened during processing of request from ('127.0.0.1', 48039)
Traceback (most recent call last):
File "/opt/python3/lib/python3.6/socketserver.py", line 639, in process_request_thread
self.finish_request(request, client_address)
File "/opt/python3/lib/python3.6/socketserver.py", line 361, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/opt/python3/lib/python3.6/socketserver.py", line 696, in __init__
self.handle()
File "/root/python_study/high_ftp/core/main.py", line 84, in handle
recv_cmd = self.request.recv(1024).decode()
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd3 in position 1: invalid continuation byte
發現計算文件大小使用了len,使用方式不對。修改使用了os.path.getsize計算
Exception happened during processing of request from ('127.0.0.1', 4316)
Traceback (most recent call last):
File "C:\Python36-32\lib\socketserver.py", line 639, in process_request_thread
self.finish_request(request, client_address)
File "C:\Python36-32\lib\socketserver.py", line 361, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "C:\Python36-32\lib\socketserver.py", line 696, in __init__
self.handle()
File "D:\51cto\python\Advance4\homework\Adv_ftp\high_ftp\core\main.py", line 106, in handle
out_result = fun(**cmd_json)
File "D:\51cto\python\Advance4\homework\Adv_ftp\high_ftp\core\main.py", line 68, in put
new_file_md5 = m.hexdegest()
AttributeError: '_hashlib.HASH' object has no attribute 'hexdegest'
拼寫錯誤了
Traceback (most recent call last):
File "D:/1_oldboyS14_Py/Advance4/homework/Adv_ftp/high_ftp/ftpclient/ftpclient_core.py", line 121, in <module>
ftp.interaction()
File "D:/1_oldboyS14_Py/Advance4/homework/Adv_ftp/high_ftp/ftpclient/ftpclient_core.py", line 48, in interaction
out = func(mess)
TypeError: get() takes 1 positional argument but 2 were given
原因是:發現我定義了2個同名的函數,導致出錯
Traceback (most recent call last):
File "D:/1_oldboyS14_Py/Advance4/homework/Adv_ftp/high_ftp/ftpclient/ftpclient_core.py", line 123, in <module>
ftp.interaction()
File "D:/1_oldboyS14_Py/Advance4/homework/Adv_ftp/high_ftp/ftpclient/ftpclient_core.py", line 48, in interaction
out = func(mess)
File "D:/1_oldboyS14_Py/Advance4/homework/Adv_ftp/high_ftp/ftpclient/ftpclient_core.py", line 66, in get
if recv_msg['id'] == '200':
TypeError: string indices must be integers
類型錯誤
----------------------------------------
Exception happened during processing of request from ('127.0.0.1', 53957)
Traceback (most recent call last):
File "D:\Python36\lib\socketserver.py", line 639, in process_request_thread
self.finish_request(request, client_address)
File "D:\Python36\lib\socketserver.py", line 361, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "D:\Python36\lib\socketserver.py", line 696, in __init__
self.handle()
File "D:\1_oldboyS14_Py\Advance4\homework\Adv_ftp\high_ftp\core\main.py", line 126, in handle
out_result = fun(**cmd_json)
File "D:\1_oldboyS14_Py\Advance4\homework\Adv_ftp\high_ftp\core\main.py", line 19, in get
self.request.send(kwargs.encode('utf-8'))
AttributeError: 'dict' object has no attribute 'encode'
應該發送時候轉換為字符串發送
----------------------------------------
Exception happened during processing of request from ('127.0.0.1', 54134)
Traceback (most recent call last):
File "D:\Python36\lib\socketserver.py", line 639, in process_request_thread
self.finish_request(request, client_address)
File "D:\Python36\lib\socketserver.py", line 361, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "D:\Python36\lib\socketserver.py", line 696, in __init__
self.handle()
File "D:\1_oldboyS14_Py\Advance4\homework\Adv_ftp\high_ftp\core\main.py", line 127, in handle
out_result = fun(**cmd_json)
File "D:\1_oldboyS14_Py\Advance4\homework\Adv_ftp\high_ftp\core\main.py", line 25, in get
self.request.send(line.encode('utf-8'))
AttributeError: 'bytes' object has no attribute 'encode'
文件打開讀取就是rb模式,所以這里不用在encode了
TypeError: argument of type 'socket' is not iterable
寫錯了
應該是:if s is self.server: 寫成 if s in self.server 新手都會這樣
故障提示:
SQLAlchemy插入數據產生警告
cursors.py:166: Warning: (1366, "Incorrect string value: '\\xD6\\xD0\\xB9\\xFA\\xB1\\xEA...' for column 'VARIABLE_VALUE' at row 479")result = self._query(query)
分析:我的環境是在windows系統里使用Pycharm進行sqlalchemy對數據庫的初始化連接操作,就是沒有建表,只做數據庫的連接都報這個錯誤,windows系統默認使用的是gbk的字符集,而我在windows系統上使用的數據庫也是在本機windows系統上,而報錯是因為字符集的問題,但是我指定了數據庫的字符集是utf8的,然每次連接依然有這個錯誤,個人分析應該是系統字符串造成的。所以我改到使用linux系統里的mysql建立一個utf8的數據庫后,使用未出現上述問題,所以分析應該是系統字符串導致的。
故障提示:
cursors.py:166: Warning: (1265, "Data truncated for column 'pub_date' at row 1")
原因:今天學習sqlalchemy添加數據,定義的字段類型為DATE,然后就隨便寫了個日期,運行后報這個錯誤,然后表里日志都為0,仔細查看,原來是日期沒有寫對,比如寫成2015-02-31,運行就會報錯如上。修改成標准的自然月份日期后,運行正確。
問題:在寫MQ主機管理作業時候,在客戶端啟動程序報錯如下:
Traceback (most recent call last):
File "mq_client.py", line 11, in <module>
run()
File "/opt/python3/zhaoyong/mq/client/core/main.py", line 79, in run
setting.localhost_ip)
AttributeError: module 'conf.setting' has no attribute 'localhost_ip'
答案:
這里不需要這個參數,所以在配置文件中刪除了。而程序里沒有刪除。刪除程序里的這個參數即可。
故障提示:
response = tmp_list[body_data[1]]['data']
TypeError: list indices must be integers or slices, not str
答案:以上提示說明你類型使用錯誤,上面tmp_list本來是個列表,我按照字典方式使用。
故障提示:
File "D:/51cto/python_dev/oldboy_dev_python/Advance5/homework/Stu_Mam_System/study/student_system.py", line 167, in modify_score
filter(Study_record.stu_id == student_obj.id).first()
AttributeError: 'Query' object has no attribute 'id'
說明:在使用sqlarchemy寫學員管理系統時候,數據庫查詢操作出現錯誤如上。
答案:進入查看167行代碼,發現之前在查詢生成student_obj對象時候,在查詢末尾沒有寫.first(),導致這里報錯。在之前的查詢里添加.first()解決。
故障提示:
learn_all = self.session(class_m2m_learn).filter(class_m2m_learn.class_id==class_obj.id).all()
TypeError: 'Session' object is not callable
解決:使用sqlalchemy進行數據表查詢時候,沒有寫session.query中的 query
故障提示:在使用sqlalchemy進行查詢
File "D:\1_oldboy_S14_git_python\oldboy_dev_python\Advance5\homework\Stu_Mam_System\core\teacher_view.py", line 50, in create_class
print(learn_all.learns)
AttributeError: 'list' object has no attribute 'learns'
解決:分析我查詢使用的是session.query.......all(),結尾用all()返回的是一個列表。所以是不可以直接采用對象名.字段名提取數據的。要用for循環一下
故障提示:前端使用jquery提示
錯誤:Uncaught Error: Bootstrap's JavaScript requires jQuery
位置:bootstrap.min.js:6
解決方案:引入jquery.min.js放在bootstrap.min.js文件之前引用
故障提示:
self.status.split(' ',1)[0], self.bytes_sent
AttributeError: 'NoneType' object has no attribute 'split'
出現的情況:我在寫前端頁面時候,通過在from表單內的input標簽填入數據,然后使用button 確定按鈕進行ajax提交到后台django 的數據庫進行插入數據,插入完成使用httpresponse返回成功字串,我這里出現的情況是數據插入成功,但是在ajax的success 沒有接收到后端httpresponse的返回字串
解決:經過測試,直接使用Input+ajax提交,去掉form表單,為什么這樣呢,繼續學習。
故障說明:前端ajax以列表信息獲取select多選數組,以數組提交到django后台,后台使用getlist('標簽name')獲取到的列表為空。
解決:后台如果獲取前端提交過來的數組,后台獲取寫法為:getlist('標簽name[]'),要在名稱后面加入:[]
故障:在前端進行select編輯多選界面,當不選擇的時候進行提交,使用ajax判斷為空的情況下使用:變量名.length 報錯
解決:var 變量 = $('#id').val()
if (變量 == null) 進行判斷
故障出現:
在linux系統內部使用 curl http://xxxxxx/?a=1&b=2 get訪問在django后台只能夠獲取第一個參數,后面的全部無法獲取
分析:由於url中有&,其他參數獲取不到,在linux系統中& 會使進程系統后台運行。
解決:必須對&進行下轉義才能在后台獲取到所有參數: curl http://xxxxxx/?a=1\&b=2
未注意一個逗號引發的問題
故障出現:寫完一個class后,在構造函數中的每個參數后增加了一個逗號(未注意),如下:
class c1:
def __init__(self, a):
self.__a = a,
這樣在類實例化后,self.__a 的值為一個元組或者列表,去掉逗號,就會以原類型出現。
故障出現:
通過django的models創建表后,在通過前端生成的數據寫入表的時候,日志提示:
D:\Python36\lib\site-packages\pymysql\cursors.py:166: Warning: (1264, "Out of range value for column 'salt_task_jid' at row 1")
查看數據庫,此字段的數據不對。
分析:
根據字面意思,應該是字段輸入的長度超過了默認的表的字段長度。
解決:
重新修改models這個表的字段長度,解決。
故障出現:
循環字典提示:ValueError: too many values to unpack (expected 2)
分析:字典這個是一個迭代器對象,參考官方文檔找到下列說明,字典只支持Key的遍歷,,如果想對key,value,則可以使用items方法。
故障出現:
在通過saltstack-api進行開發時候,在同一個minion上多次運行state.sls,第二個任務開始返回的信息是:
['The function "state.sls" is running as PID 537 and was started at 2018, Jun 13 12:31:22.535288 with jid 20180613123122535288']
分析:由於state.sls是串行的,就是說不能在同一個minion上同時執行多個state.sls,而剛才即便中斷了,但是命令已經下發給minion了,所以再次執行報錯。
解決:等待minion執行完state.sls,master再次執行命令就不報錯了。
故障出現:
linux下使用curl http://xxxx/x?a=1&b=2 ,我通過django寫的api接口只能獲取到1,后面的無法獲取到,百度了找到了問題。
解決:在Linux下使用curl訪問多參數url GET參數的問題,在linux系統中& 會使進程系統后台運行,必須對&進行下轉義。寫法如下:
curl http://xxxx/x?a=1\&b=2 注意:是&號前是一哦那個“ \ " 進行了轉義