關於pythonjsonindex的信息

本文目錄一覽:

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-16 14:14
下一篇 2024-11-16 14:14

相關推薦

  • Java 監控接口返回信息報錯信息怎麼處理

    本文將從多個方面對 Java 監控接口返回信息報錯信息的處理方法進行詳細的闡述,其中包括如何捕獲異常、如何使用日誌輸出錯誤信息、以及如何通過異常處理機制解決報錯問題等等。以下是詳細…

    編程 2025-04-29
  • 使用Python爬蟲獲取電影信息的實現方法

    本文將介紹如何使用Python編寫爬蟲程序,來獲取和處理電影數據。需要了解基本的Python編程語言知識,並使用BeautifulSoup庫和Requests庫進行爬取。 一、準備…

    編程 2025-04-28
  • Python爬取網頁信息

    本文將從多個方面對Python爬取網頁信息做詳細的闡述。 一、爬蟲介紹 爬蟲是一種自動化程序,可以模擬人對網頁進行訪問獲取信息的行為。通過編寫代碼,我們可以指定要獲取的信息,將其從…

    編程 2025-04-28
  • 如何使用Python執行Shell命令並獲取執行過程信息

    本文將介紹如何使用Python執行Shell命令並獲取執行過程信息。我們將從以下幾個方面進行闡述: 一、執行Shell命令 Python內置的subprocess模塊可以方便地執行…

    編程 2025-04-28
  • Python實現身份信息模擬生成與查驗

    本文將從以下幾個方面對Python實現身份信息模擬生成與查驗進行詳細闡述: 一、身份信息生成 身份信息生成是指通過代碼生成符合身份信息規範的虛假數據。Python中,我們可以使用f…

    編程 2025-04-27
  • Dapper使用getschema獲取表信息

    本文旨在介紹Dapper中使用getschema獲取表信息的方法和注意事項。 一、獲取某張表的所有列信息 使用Dapper獲取某張表信息,可以使用 `IDbConnection.G…

    編程 2025-04-27
  • 已裝備我軍的空中信息化作戰平台

    本文將會從多個方面詳細闡述已裝備我軍的空中信息化作戰平台。 一、平台概述 已裝備我軍的空中信息化作戰平台是一個全新的作戰系統,具備實時數據採集、處理、分析、共享的能力。它可以在不同…

    編程 2025-04-27
  • 通過提交信息搜索-使用git

    本篇文章重點講解如何使用git通過提交信息來搜索。我們將從多個方面介紹如何使用git來搜索提交信息,並提供相應的代碼示例以供參考。 一、搜索方式 Git提供了三種搜索方式,分別為:…

    編程 2025-04-27
  • Linux查看系統信息

    一、CPU信息 Linux系統下,查看CPU的信息最常用的命令是lscpu。該命令可以顯示CPU架構、核心數量、線程數、緩存大小、CPU頻率等信息。例如: lscpu 該命令會輸出…

    編程 2025-04-24
  • 軟考 信息安全工程師

    軟考 信息安全工程師是一項技能型國家級資格認證考試,主要測試考生在信息安全領域的理論知識和實踐技能,是證明個人信息安全能力的重要證書。本文將從多個方面對軟考 信息安全工程師做詳細的…

    編程 2025-04-23

發表回復

登錄後才能評論