本文目錄一覽:
- 1、Python 數據處理(三十五)—— 文本數據處理
- 2、如何執行python第三方包windows exe格式
- 3、如何爬蟲天貓店鋪數據python
- 4、python: pandas to_json官方文檔及實例
- 5、如何使用python 開發一個api
- 6、Python+selenium自動化,Allure包不生成index.html文件,解決方法
Python 數據處理(三十五)—— 文本數據處理
在 pandas 中,存儲文本主要有兩種方式
但一般建議使用 StringDtype 類型存儲文本數據。都是由於各種原因,現在字符串數據的默認存儲類型還是 object 。
要存儲為 string 類型,需要顯式的設置 dtype 參數
或者在創建 Series 或 DataFrame 之後,使用 astype 轉換類型
也可以使用 StringDtype/”string” 轉換其他非字符串類型的數據
轉換現有數據的類型
StringDtype 類型對象與 object 類型之間存在一些差異
兩個結果的輸出都是 Int64 類型。將其與 object 類型比較
當存在 NA 值時,輸出為 float64 。類似地,對於返回布爾值的方法
Series 和 Index 有一套字符串處理方法,可以方便地對數組的每個元素進行操作,最重要的是,這些方法會自動忽略缺失值。
這些方法可以通過 str 屬性訪問,通常具有與內置字符串方法相匹配的名稱
Index 上的字符串方法對於清理或轉換 DataFrame 的列特別有用。
例如,您可能有帶有前導或後置空格的列
因為 df.columns 是一個 Index 對象,所以我們可以使用 .str 訪問器
我們可以根據需要對列名進行處理,然後重新設置列名。
例如,我們刪除列名的前後空格,並將其改為小寫字母,同時用 _ 替換剩餘的空格
split 方法會返回一個值為 list 的 Series
可以使用 get 或 [] 訪問拆分後的列表中的元素
更簡單的方法是設置 expand 參數,返回一個 DataFrame
當原來的 Series 包含 StringDtype 類型的數據時,輸出列也將全部為 StringDtype
當然,也可以設置切割次數
它還有個對應的 rsplit 方法,從右邊起始對字符串進行拆分
replace 參數支持使用正則表達式,前兩個參數是 pat (匹配模式) 和 repl (替換字符串)
如果只是想要替換字符串字面值,可以將 regex 參數設置為 False ,而不需要對每個特殊字符進行轉義。此時 pat 和 repl 參數必須是字符串
此外, replace 方法還接受一個可調用的替換函數,會使用 re.sub() 方法在每個匹配的模式上調用該函數
該函數需要傳入一個正則對象作為位置參數,並返回一個字符串。例如
replace 方法的 pat 參數還接受 re.compile() 編譯的正則表達式對象。所有的 flags 需要在編譯正則對象時設置
如果在 replace 中設置 flags 參數,則會拋出異常
有幾種方法可以將一個 Series 或 Index 與自己或其他的 Series 或 Index 相連接,所有這些方法都是基於 cat() 方法
可以連接一個 Series 或 Index 的內容
如果未指定 sep 參數,則默認為空字符串
默認會跳過缺失值,也可以使用 na_rep 指定缺失值的表示方式
cat() 的第一個參數 others 可以是類似列表的對象,但是其長度需要和調用對象一致
只要兩個對象中存在缺失值,對應的結果中也是缺失值,除非指定了 na_rep
others 參數也可以是二維的,但是得保證其行數必須與調用的對象一致
對於 Series 或 DataFrame 的連接,可以通過設置 join 參數指定對齊方式
通常 join 可選範圍為: ‘left’ , ‘outer’ , ‘inner’ , ‘right’ 。此時,不再要求兩個對象長度一致
當 others 參數是 DataFrame 時,也可以使用
可以將一些類似數組的對象(如 Series , Index 等)放在一個類似列表的容器中,然後傳遞給 cat
對於沒有索引的對象,其長度必須與調用 cat 的對象相同。但是 Series 和 Index 可以是任意的,除非設置了 json=None 。
如果在 others 參數上包含不同索引的對象,且設置了 join=’right’ ,則最後的結果將會是這些索引的並集
如何執行python第三方包windows exe格式
python第三方包的windows安裝文件exe格式, 這上面有很多python第三方包的二進制安裝文件,包括32位和64位的。下載安裝就ok了!
這下面有很多python第三方包的二進制安裝文件,包括32位和64位的。下載安裝就ok了!
包括了mysqldb,ldap等。
Index by date:
fiona
scikit-image
netcdf4
mercurial
scikits.audiolab
numba
llvmpy
python-igraph
rpy2
numpy
opencv
zope.interface
sfepy
quantlib
gdal
imread
django
psychopy
cx_freeze
msgpack
regex
cellcognition
vigra
scikit-learn
pytables
h5py
blender-mathutils
htseq
bioformats
simplejson
pyzmq
mako
simpleitk
qimage2ndarray
ujson
vlfd
libsvm
liblinear
cgkit
scipy
distribute
noise
theano
pyalembic
openimageio
pyaudio
pymca
pyamg
pgmagick
lxml
steps
sqlalchemy
cffi
biopython
python-ldap
pycurl
nipy
nibabel
pygments
mahotas
py-postgresql
pyamf
planar
holopy
pyvisa
jcc
polymode
polygon
cython
pyropes
llist
shapely
vtk
pymongo
libpython
meshpy
pandas
umysql
epydoc
coverage
cheetah
pyrxp
pybluez
pythonmagick
bsdiff4
pymssql
pymol
boost.python
orange
requests
pywcs
python-sundials
pymix
pyminuit
pylzma
pyicu
assimulo
basemap
pygraphviz
pyproj
mpi4py
spyder
pytz
pyfits
mysql-python
pygame
pycparser
twisted
pil
qutip
openexr
nipype
python-snappy
visvis
docutils
pyhdf
pyqwt
kivy
scikits.umfpack
psycopg
ets
guiqwt
veusz
pyqt
pyside
dpmix
py-fcm
scikits.hydroclimpy
smc.freeimage
scipy-stack
ipython
nose
mxbase
numexpr
pyyaml
ode
virtualenv
aspell_python
tornado
pywavelets
bottleneck
networkx
statsmodels
pylibdeconv
pyhook
lmfit
slycot
ndimage
scikits.scattpy
cvxopt
pymc
pysparse
scikits.odes
matplotlib
vpython
pycuda
pyopencl
pymvpa
pythonnet
cld
mod_wsgi
nltk
python-levenshtein
rtree
pywin32
scientificpython
sympy
thrift
pyopengl-accelerate
mdp
pyopengl
gmpy
reportlab
natgrid
scikits.vectorplot
pyreadline
milk
blosc
pycogent
pip
gevent
scons
carray
python-dateutil
jinja2
markupsafe
jsonlib
pysfml
fonttools
silvercity
console
python-cjson
pycluster
cdecimal
pytst
autopy
sendkeys
ceodbc
fipy
psutil
pyephem
pycifrw
blist
line_profiler
pydbg
bitarray
pyglet
python-lzo
faulthandler
delny
pyexiv2
ilastik
twainmodule
scitools
pyspharm
casuarius
pyodbc
greenlet
nitime
pylibtiff
mmtk
pycairo
pysqlite
curses
videocapture
bazaar
nlopt
trfit
libsbml
oursql
sphinx
cellprofiler
py2exe
re2
liblas
cgal-python
pymedia
ffnet
pyfftw
libxml-python
pyfltk
pymex
pymatlab
zodb3
mmlib
pygtk
pyserial
babel
scikits.ann
scikits.delaunay
numeric
pulp
nmoldyn
pymutt
iocbio
jpype
wxpython
pybox2d
dipy
mmseg
pynifti
scikits.samplerate
scikits.timeseries
vitables
quickfix
如何爬蟲天貓店鋪數據python
本編博客是關於爬取天貓店鋪中指定店鋪的所有商品基礎信息的爬蟲,爬蟲運行只需要輸入相應店鋪的域名名稱即可,信息將以csv表格的形式保存,可以單店爬取也可以增加一個循環進行同時爬取。
源碼展示
首先還是完整代碼展示,後面會分解每個函數的意義。
# -*- coding: utf-8 -*-
import requests
import json
import csv
import random
import re
from datetime import datetime
import time
class TM_producs(object):
def __init__(self,storename):
self.storename = storename
self.url = ”.format(storename)
self.headers = {
“user-agent”:”Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 “
“(KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1”
}
datenum = datetime.now().strftime(‘%Y%m%d%H%M’)
self.filename = ‘{}_{}.csv’.format(self.storename, datenum)
self.get_file()
def get_file(self):
”’創建一個含有標題的表格”’
title = [‘item_id’,’price’,’quantity’,’sold’,’title’,’totalSoldQuantity’,’url’,’img’]
with open(self.filename,’w’,newline=”) as f:
writer = csv.DictWriter(f,fieldnames=title)
writer.writeheader()
return
def get_totalpage(self):
”’提取總頁碼數”’
num = random.randint(83739921,87739530)
endurl = ‘/shop/shop_auction_search.do?sort=sp=1page_size=12from=h5ajson=1_tm_source=tmallsearchcallback=jsonp_{}’
url = self.url + endurl.format(num)
html = requests.get(url,headers=self.headers).text
infos = re.findall(‘\(({.*})\)’,html)[0]
infos = json.loads(infos)
totalpage = infos.get(‘total_page’)
return int(totalpage)
def get_products(self,page):
”’提取單頁商品列表”’
num = random.randint(83739921, 87739530)
endurl = ‘/shop/shop_auction_search.do?sort=sp={}page_size=12from=h5ajson=1_tm_source=tmallsearchcallback=jsonp_{}’
url = self.url + endurl.format(page,num)
html = requests.get(url, headers=self.headers).text
infos = re.findall(‘\(({.*})\)’, html)[0]
infos = json.loads(infos)
products = infos.get(‘items’)
title = [‘item_id’, ‘price’, ‘quantity’, ‘sold’, ‘title’, ‘totalSoldQuantity’, ‘url’, ‘img’]
with open(self.filename, ‘a’, newline=”) as f:
writer = csv.DictWriter(f, fieldnames=title)
writer.writerows(products)
def main(self):
”’循環爬取所有頁面寶貝”’
total_page = self.get_totalpage()
for i in range(1,total_page+1):
self.get_products(i)
print(‘總計{}頁商品,已經提取第{}頁’.format(total_page,i))
time.sleep(1+random.random())
if __name__ == ‘__main__’:
storename = ‘uniqlo’
tm = TM_producs(storename)
tm.main()
上面代碼是選擇了優衣庫作為測試店鋪,直接輸入優衣庫店鋪的域名中關鍵詞即可,最終表格會按照店鋪名稱和時間名詞。
代碼解讀
導入庫說明
requests 庫不用多數,爬取網頁的主要庫
json 庫是用來解析 json 格式的數據的,也就是 Python 中的字典格式
csv 庫是用來創建 csv 表格和保存信息的
random 庫是用來生成一個隨機數的,這個代碼中用到了兩次,第一次是生成一個隨機數據去獲取最新的網頁信息而不是緩存信息,第二次是隨機一個時間,來減緩爬蟲速度
re 庫是正則,主要用來提取信息
datetime 和 time 都是時間庫,前者一般用來生成當前時間字符串,後者本爬蟲使用設置延遲時間
爬蟲思路
首先通過分析手機端天貓店鋪所有商品的網頁,可以發現每次下滑一頁都有一個 js 被加載,這個 js 的規律可以總結一下;
通過分析可以發現每次請求 js 都可以得到一個關鍵信息,那就是 total_page 這個參數,這也一想就能猜到,就是當前店鋪的總頁碼數,所以可以先取得這個數字,然後使用循環爬取全店商品;
每一頁有24個商品,而請求得到的是一個類似於 json 格式的網頁信息,但是並非是直接的 json,所以可以用正則表達式提取符合 json 格式的部分留用;
將每一頁的信息保存到 csv 表格中,可以直接使用 csv 庫的字典存儲方式,非常方便;
得到了單頁的信息,也得到了總頁碼數,只需要一個循環就可以爬取全店的商品了。
構造爬蟲類
def __init__(self,storename):
self.storename = storename
self.url = ‘.format(storename)
self.headers = {
“user-agent”:”Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 “
“(KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1”
}
datenum = datetime.now().strftime(‘%Y%m%d%H%M’)
self.filename = ‘{}_{}.csv’.format(self.storename, datenum)
self.get_file()
上面代碼依次完成以下操作:
首先整個爬蟲是寫成了一個類,在初始化類的時候需要傳遞一個參數,這個參數就是店鋪的名稱。
然後構造出店鋪的所有商品頁面的前半部分,這部分都是不會變的
接着設置一個請求頭
按照當前時間生成一個以時間為依據的字符串,用來給文件命名,然後賦值給文件名稱,確定保存文件的名稱
最後一句是在類生成的時候就運行這個函數,及生成一個帶有標題的表格,後面會說道這個函數的具體含義
python: pandas to_json官方文檔及實例
時間格式參數:(timestamp)
官方文檔:
Type of date conversion. 『epoch』 = epoch milliseconds, 『iso』 = ISO8601. The default depends on the orient. For orient=’table’, the default is 『iso』. For all other orients, the default is 『epoch』.
The time unit to encode to, governs timestamp and ISO8601 precision. One of 『s』, 『ms』, 『us』, 『ns』 for second, millisecond, microsecond, and nanosecond respectively.
orient : str
Indication of expected JSON string format.
Series:
default is 『index』
allowed values are: {『split』,』records』,』index』,』table』}.
DataFrame:
default is 『columns』
allowed values are: {『split』, 『records』, 『index』, 『columns』, 『values』, 『table』}.
『split』 : dict like {『index』 – [index], 『columns』 – [columns], 『data』 – [values]}
『records』 : list like [{column – value}, … , {column – value}]
『index』 : dict like {index – {column – value}}
『columns』 : dict like {column – {index – value}}
『values』 : just the values array
『table』 : dict like {『schema』: {schema}, 『data』: {data}}
Describing the data, where data component is like orient=’records’.
Changed in version 0.20.0.
如何使用python 開發一個api
使用 Python 和 Flask 設計 RESTful API
近些年來 REST (REpresentational State Transfer) 已經變成了 web services 和 web APIs 的標配。
在本文中我將向你展示如何簡單地使用 Python 和 Flask 框架來創建一個 RESTful 的 web service。
什麼是 REST?
六條設計規範定義了一個 REST 系統的特點:
客戶端-服務器: 客戶端和服務器之間隔離,服務器提供服務,客戶端進行消費。
無狀態: 從客戶端到服務器的每個請求都必須包含理解請求所必需的信息。換句話說, 服務器不會存儲客戶端上一次請求的信息用來給下一次使用。
可緩存: 服務器必須明示客戶端請求能否緩存。
分層系統: 客戶端和服務器之間的通信應該以一種標準的方式,就是中間層代替服務器做出響應的時候,客戶端不需要做任何變動。
統一的接口: 服務器和客戶端的通信方法必須是統一的。
按需編碼: 服務器可以提供可執行代碼或腳本,為客戶端在它們的環境中執行。這個約束是唯一一個是可選的。
什麼是一個 RESTful 的 web service?
REST 架構的最初目的是適應萬維網的 HTTP 協議。
RESTful web services 概念的核心就是「資源」。 資源可以用 URI 來表示。客戶端使用 HTTP 協議定義的方法來發送請求到這些 URIs,當然可能會導致這些被訪問的」資源「狀態的改變。
HTTP 標準的方法有如下:
========== ===================== ==================================
HTTP 方法 行為 示例
========== ===================== ==================================
GET 獲取資源的信息
GET 獲取某個特定資源的信息
POST 創建新資源
PUT 更新資源
DELETE 刪除資源
========== ====================== ==================================
REST 設計不需要特定的數據格式。在請求中數據可以以 JSON 形式, 或者有時候作為 url 中查詢參數項。
設計一個簡單的 web service
堅持 REST 的準則設計一個 web service 或者 API 的任務就變成一個標識資源被展示出來以及它們是怎樣受不同的請求方法影響的練習。
比如說,我們要編寫一個待辦事項應用程序而且我們想要為它設計一個 web service。要做的第一件事情就是決定用什麼樣的根 URL 來訪問該服務。例如,我們可以通過這個來訪問:
http://[hostname]/todo/api/v1.0/
在這裡我已經決定在 URL 中包含應用的名稱以及 API 的版本號。在 URL 中包含應用名稱有助於提供一個命名空間以便區分同一系統上的其它服務。在 URL 中包含版本號能夠幫助以後的更新,如果新版本中存在新的和潛在不兼容的功能,可以不影響依賴於較舊的功能的應用程序。
下一步驟就是選擇將由該服務暴露(展示)的資源。這是一個十分簡單地應用,我們只有任務,因此在我們待辦事項中唯一的資源就是任務。
我們的任務資源將要使用 HTTP 方法如下:
========== =============================================== =============================
HTTP 方法 URL 動作
========== =============================================== ==============================
GET http://[hostname]/todo/api/v1.0/tasks 檢索任務列表
GET http://[hostname]/todo/api/v1.0/tasks/[task_id] 檢索某個任務
POST http://[hostname]/todo/api/v1.0/tasks 創建新任務
PUT http://[hostname]/todo/api/v1.0/tasks/[task_id] 更新任務
DELETE http://[hostname]/todo/api/v1.0/tasks/[task_id] 刪除任務
========== ================================================ =============================
我們定義的任務有如下一些屬性:
id: 任務的唯一標識符。數字類型。
title: 簡短的任務描述。字符串類型。
description: 具體的任務描述。文本類型。
done: 任務完成的狀態。布爾值。
目前為止關於我們的 web service 的設計基本完成。剩下的事情就是實現它!
Flask 框架的簡介
如果你讀過 Flask Mega-Tutorial 系列,就會知道 Flask 是一個簡單卻十分強大的 Python web 框架。
在我們深入研究 web services 的細節之前,讓我們回顧一下一個普通的 Flask Web 應用程序的結構。
我會首先假設你知道 Python 在你的平台上工作的基本知識。 我將講解的例子是工作在一個類 Unix 操作系統。簡而言之,這意味着它們能工作在 Linux,Mac OS X 和 Windows(如果你使用Cygwin)。 如果你使用 Windows 上原生的 Python 版本的話,命令會有所不同。
讓我們開始在一個虛擬環境上安裝 Flask。如果你的系統上沒有 virtualenv,你可以從 上下載:
$ mkdir todo-api
$ cd todo-api
$ virtualenv flask
New python executable in flask/bin/python
Installing setuptools……………………….done.
Installing pip……………….done.
$ flask/bin/pip install flask
既然已經安裝了 Flask,現在開始創建一個簡單地網頁應用,我們把它放在一個叫 app.py 的文件中:
#!flask/bin/pythonfrom flask import Flaskapp = Flask(__name__)@app.route(‘/’)def index():
return “Hello, World!”if __name__ == ‘__main__’:
app.run(debug=True)
為了運行這個程序我們必須執行 app.py:
$ chmod a+x app.py
$ ./app.py
* Running on
* Restarting with reloader
現在你可以啟動你的網頁瀏覽器,輸入 看看這個小應用程序的效果。
簡單吧?現在我們將這個應用程序轉換成我們的 RESTful service!
使用 Python 和 Flask 實現 RESTful services
使用 Flask 構建 web services 是十分簡單地,比我在 Mega-Tutorial 中構建的完整的服務端的應用程序要簡單地多。
在 Flask 中有許多擴展來幫助我們構建 RESTful services,但是在我看來這個任務十分簡單,沒有必要使用 Flask 擴展。
我們 web service 的客戶端需要添加、刪除以及修改任務的服務,因此顯然我們需要一種方式來存儲任務。最直接的方式就是建立一個小型的數據庫,但是數據庫並不是本文的主體。學習在 Flask 中使用合適的數據庫,我強烈建議閱讀 Mega-Tutorial。
這裡我們直接把任務列表存儲在內存中,因此這些任務列表只會在 web 服務器運行中工作,在結束的時候就失效。 這種方式只是適用我們自己開發的 web 服務器,不適用於生產環境的 web 服務器, 這種情況一個合適的數據庫的搭建是必須的。
我們現在來實現 web service 的第一個入口:
#!flask/bin/pythonfrom flask import Flask, jsonifyapp = Flask(__name__)tasks = [
{
‘id’: 1,
‘title’: u’Buy groceries’,
‘description’: u’Milk, Cheese, Pizza, Fruit, Tylenol’,
‘done’: False
},
{
‘id’: 2,
‘title’: u’Learn Python’,
‘description’: u’Need to find a good Python tutorial on the web’,
‘done’: False
}]@app.route(‘/todo/api/v1.0/tasks’, methods=[‘GET’])def get_tasks():
return jsonify({‘tasks’: tasks})if __name__ == ‘__main__’:
app.run(debug=True)
正如你所見,沒有多大的變化。我們創建一個任務的內存數據庫,這裡無非就是一個字典和數組。數組中的每一個元素都具有上述定義的任務的屬性。
取代了首頁,我們現在擁有一個 get_tasks 的函數,訪問的 URI 為 /todo/api/v1.0/tasks,並且只允許 GET 的 HTTP 方法。
這個函數的響應不是文本,我們使用 JSON 數據格式來響應,Flask 的 jsonify 函數從我們的數據結構中生成。
使用網頁瀏覽器來測試我們的 web service 不是一個最好的注意,因為網頁瀏覽器上不能輕易地模擬所有的 HTTP 請求的方法。相反,我們會使用 curl。如果你還沒有安裝 curl 的話,請立即安裝它。
通過執行 app.py,啟動 web service。接着打開一個新的控制台窗口,運行以下命令:
$ curl -i
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 294
Server: Werkzeug/0.8.3 Python/2.7.3
Date: Mon, 20 May 2013 04:53:53 GMT
{
“tasks”: [
{
“description”: “Milk, Cheese, Pizza, Fruit, Tylenol”,
“done”: false,
“id”: 1,
“title”: “Buy groceries”
},
{
“description”: “Need to find a good Python tutorial on the web”,
“done”: false,
“id”: 2,
“title”: “Learn Python”
}
]
}
我們已經成功地調用我們的 RESTful service 的一個函數!
現在我們開始編寫 GET 方法請求我們的任務資源的第二個版本。這是一個用來返回單獨一個任務的函數:
from flask import abort@app.route(‘/todo/api/v1.0/tasks/int:task_id’, methods=[‘GET’])def get_task(task_id):
task = filter(lambda t: t[‘id’] == task_id, tasks)
if len(task) == 0:
abort(404)
return jsonify({‘task’: task[0]})
第二個函數有些意思。這裡我們得到了 URL 中任務的 id,接着 Flask 把它轉換成 函數中的 task_id 的參數。
我們用這個參數來搜索我們的任務數組。如果我們的數據庫中不存在搜索的 id,我們將會返回一個類似 404 的錯誤,根據 HTTP 規範的意思是 「資源未找到」。
如果我們找到相應的任務,那麼我們只需將它用 jsonify 打包成 JSON 格式並將其發送作為響應,就像我們以前那樣處理整個任務集合。
調用 curl 請求的結果如下:
$ curl -i
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 151
Server: Werkzeug/0.8.3 Python/2.7.3
Date: Mon, 20 May 2013 05:21:50 GMT
{
“task”: {
“description”: “Need to find a good Python tutorial on the web”,
“done”: false,
“id”: 2,
“title”: “Learn Python”
}
}
$ curl -i
HTTP/1.0 404 NOT FOUND
Content-Type: text/html
Content-Length: 238
Server: Werkzeug/0.8.3 Python/2.7.3
Date: Mon, 20 May 2013 05:21:52 GMT
!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 3.2 Final//EN”
title404 Not Found/title
h1Not Found/h1
pThe requested URL was not found on the server./ppIf you entered the URL manually please check your spelling and try again./p
當我們請求 id #2 的資源時候,我們獲取到了,但是當我們請求 #3 的時候返回了 404 錯誤。有關錯誤奇怪的是返回的是 HTML 信息而不是 JSON,這是因為 Flask 按照默認方式生成 404 響應。由於這是一個 Web service 客戶端希望我們總是以 JSON 格式回應,所以我們需要改善我們的 404 錯誤處理程序:
from flask import make_response@app.errorhandler(404)def not_found(error):
return make_response(jsonify({‘error’: ‘Not found’}), 404)
我們會得到一個友好的錯誤提示:
$ curl -i
HTTP/1.0 404 NOT FOUND
Content-Type: application/json
Content-Length: 26
Server: Werkzeug/0.8.3 Python/2.7.3
Date: Mon, 20 May 2013 05:36:54 GMT
{
“error”: “Not found”
}
接下來就是 POST 方法,我們用來在我們的任務數據庫中插入一個新的任務:
from flask import request@app.route(‘/todo/api/v1.0/tasks’, methods=[‘POST’])def create_task():
if not request.json or not ‘title’ in request.json:
abort(400)
task = {
‘id’: tasks[-1][‘id’] + 1,
‘title’: request.json[‘title’],
‘description’: request.json.get(‘description’, “”),
‘done’: False
}
tasks.append(task)
return jsonify({‘task’: task}), 201
添加一個新的任務也是相當容易地。只有當請求以 JSON 格式形式,request.json 才會有請求的數據。如果沒有數據,或者存在數據但是缺少 title 項,我們將會返回 400,這是表示請求無效。
接着我們會創建一個新的任務字典,使用最後一個任務的 id + 1 作為該任務的 id。我們允許 description 字段缺失,並且假設 done 字段設置成 False。
我們把新的任務添加到我們的任務數組中,並且把新添加的任務和狀態 201 響應給客戶端。
使用如下的 curl 命令來測試這個新的函數:
$ curl -i -H “Content-Type: application/json” -X POST -d ‘{“title”:”Read a book”}’
HTTP/1.0 201 Created
Content-Type: application/json
Content-Length: 104
Server: Werkzeug/0.8.3 Python/2.7.3
Date: Mon, 20 May 2013 05:56:21 GMT
{
“task”: {
“description”: “”,
“done”: false,
“id”: 3,
“title”: “Read a book”
}
}
注意:如果你在 Windows 上並且運行 Cygwin 版本的 curl,上面的命令不會有任何問題。然而,如果你使用原生的 curl,命令會有些不同:
curl -i -H “Content-Type: application/json” -X POST -d “{“””title”””:”””Read a book”””}”
當然在完成這個請求後,我們可以得到任務的更新列表:
$ curl -i
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 423
Server: Werkzeug/0.8.3 Python/2.7.3
Date: Mon, 20 May 2013 05:57:44 GMT
{
“tasks”: [
{
“description”: “Milk, Cheese, Pizza, Fruit, Tylenol”,
“done”: false,
“id”: 1,
“title”: “Buy groceries”
},
{
“description”: “Need to find a good Python tutorial on the web”,
“done”: false,
“id”: 2,
“title”: “Learn Python”
},
{
“description”: “”,
“done”: false,
“id”: 3,
“title”: “Read a book”
}
]
}
剩下的兩個函數如下所示:
@app.route(‘/todo/api/v1.0/tasks/int:task_id’, methods=[‘PUT’])def update_task(task_id):
task = filter(lambda t: t[‘id’] == task_id, tasks)
if len(task) == 0:
abort(404)
if not request.json:
abort(400)
if ‘title’ in request.json and type(request.json[‘title’]) != unicode:
abort(400)
if ‘description’ in request.json and type(request.json[‘description’]) is not unicode:
abort(400)
Python+selenium自動化,Allure包不生成index.html文件,解決方法
查看ui自動化生成的html報告。pytest+allure只生成了xml報告–json格式的數據,沒有生成html的index報告。
場景:
排查:
1.cmd輸入allure –version,查看是安裝成功
2.pycharm輸入pip freeze,查看包是否配置成功
都顯示安裝、配置成功
3.pycharm軟件Terminal中輸入allure
懷疑是pycharm軟件哪裡配置除了問題,排查浪費了N多時間。
最終總算是配置好了~
解決方法:
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/154836.html