網絡編程
urllib的request模塊可以非常方便地抓取URL內容,也就是發送一個GET請求到指定的頁面,然后返回HTTP的響應。
校驗返回值,進行接口測試:
編碼:把一個Python對象編碼轉換成Json字符串 json.dumps()
解碼:把Json格式字符串解碼轉換成Python對象 json.loads()
Post請求:
urllib庫里面有個urlencode函數,可以把key-value這樣的鍵值對轉換成我們想要的格式。
requests模塊
urllib模塊是python自帶的網頁模塊,但是並不好用,好用的是requests模塊
requests.get(url,params=data): get請求,返回的可以是字典也可以是json串
requests.post(url,data):post請求,返回的可以是字典也可以是json串
requests.get/post(..cookies=):請求加cookie,注意cookie是字典,不是字符串
requests.get/post(..headers=):請求加header
requests.post(..files=):上傳文件,注意excel和圖片需要用‘rb’
request.get(url) .content:下載文件,二進制文件要用‘wb’
異常處理
程序一旦報錯,就會中止運行,不夠人性化,希望有問題的部分可以給出提示,沒有問題的部分可以正常運行,可以用if做判斷,但會導致代碼不易讀
try:檢查哪些代碼會產生異常,后面跟except來捕獲異常,如果沒有捕捉到異常,程序還是會報錯
except 某類異常 as e:如果try中發生該類異常,則執行。一個try可以寫多個except,用來捕捉多類異常。如果想捕捉全部異常,用except Exception as e
finally:不管try中是否發生異常,都會執行
Django部署
安裝django模塊:
打開cmd執行以下命令
pip install django==1.9
django-admin startproject my_django
打開pycharm,新建一個項目
把源代碼覆蓋到這個項目
安裝mysql MySQL Server 5.7:
打開或新建mysql路徑\my.ini,輸入以下內容保存
[mysqld]
basedir=mysql路徑
datadir=mysql路徑\data
port=3308
mysql路徑下打開cmd執行以下命令
mysqld --install MYSQL_NEW --defaults-file= mysql路徑\my.ini
net start MYSQL_NEW
連接數據庫,新建一個main數據庫
並執行main.sql初始化數據庫表
安裝redis Redis-x64-3.2.100:
打開redis.windows.conf查找requirepass foobared,在下一行加requirepass 你的密碼
Redis路徑下打開cmd執行以下命令
redis-server redis.windows.conf
啟動服務:
項目路徑下打開cmd,執行以下命令
python manage.py runserver 0.0.0.0:8000
打開瀏覽器,輸入地址
FAQ:
django.db.utils.OperationalError: (2003, "Can't connect to MySQL server on '127.0.0.1' ([WinError 10061] 由於目標計算機積極拒絕,無法連接
說明mysql服務沒有啟起來
django.db.utils.InternalError: (1366, "Incorrect string value: '\\xE7\\x94\\xA8\\xE6\\x88\\xB7...' for column 'name' at row 1")
sql不能在pycharm里執行,要放到navicat里執行
Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'information_schema.PROFILING.SEQ' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
說明sql模式是only_full_group_by,但是寫的sql中group by前面的字段不全
解決辦法兩種:第一種sql不變,在my.ini加上
[mysqld]
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
第二種把sql里group by前面的字段補全,建議用第一種
內置函數
zip()函數:用於將可迭代的對象作為參數,將對象中對應的元素打包成一個個元組,然后返回由這些元組組成的列表
還可以搭配for循環使用:
map()函數:Python 內置的高階函數,它接收一個函數 f 和一個 list,並通過把函數 f 依次作用在 list 的每個元素上,得到一個新的 list 並返回。
兩個參數一個是函數名,另一個是列表或元組。
注意:map()函數不改變原有的 list,而是返回一個新的 list。
filter()函數:用於過濾序列,過濾掉不符合條件的元素,返回由符合條件元素組成的新列表。
和map()類似,filter()也接收一個函數和一個序列。和map()不同的時,filter()把傳入的函數依次作用於每個元素,然后根據返回值是True還是False決定保留還是丟棄該元素。