返回顶部
首页 > 资讯 > 后端开发 > Python >Python服务端开发
  • 493
分享到

Python服务端开发

服务端Python 2023-01-31 01:01:58 493人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

之前的爬虫https://blog.csdn.net/column/details/17218.html几篇文章为python实现客户端以Get/Post等方法请求服务。最近用Python写了一个服务,在此总结一下知识点:1、Python

之前的爬虫https://blog.csdn.net/column/details/17218.html几篇文章为python实现客户端以Get/Post等方法请求服务。最近用Python写了一个服务,在此总结一下知识点:

1、Python代码中执行shell命令;

2、白名单设置---通过查看客户端ip是否在服务端的list中存在;

3、日志分割---引入loggin类实现日志记录,引入TimedRotatingFileHandler类实现日志分割;

下面以一个小Demo为例进行整理:服务端接收客户端get请求,从git拉取代码,执行修改,并在最后修改完成后提交git。代码实现的功能:

  • 对访问的客户端ip进行限制;
  • 按天记录日志,日志存放时间为60天;
  • 对get请求参数验证;
  • 拉取git,执行更新,修改完成后提交git;
# coding:utf-8

import logging
import urlparse
from BaseHttpServer import BaseHTTPRequestHandler, HTTPServer
import os
from logging.handlers import TimedRotatingFileHandler


# 客户端白名单,白名单中的机器可以访问该服务
WHITE_LIST = ['127.0.0.1']

# 操作日志记录
# 1、logging.basicConfig(level, fORMat, datefmt, filename, filemode)
#   level: 设置日志级别,默认为logging.WARNING,NOTSET/DEBUG/INFO/WARNING/ERROR/CRITICAL
#   format: 指定输出的格式和内容,format可以输出很多有用信息【'%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s'】
#   datefmt: 指定时间格式,【'%a, %d %b %Y %H:%M:%S'】
#   filename: 指定日志文件件
#   filemode: 指定日志文件的打开模式,'w'或'a'
logging.basicConfig(
    level=logging.DEBUG,
    format = '%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',  # 定义输出log的格式
    datefmt = '%Y%m%d %A %H:%M:%S',  # 时间
    filename = os.path.join(os.getcwd(), 'log.txt'),
    filemode = 'a')
# 添加 TimedRotatingFileHandler
# 2、TimedRotatingFileHandler(filename [,when [,interval [,backupCount]]])
#   filename 是输出日志文件名的前缀,比如log/myapp.log
#   when 是一个字符串的定义如下:
#     “S”: Seconds
#     “M”: Minutes
#     “H”: Hours
#     “D”: Days
#     “W”: Week day (0=Monday)
#     “midnight”: Roll over at midnight
#   interval 是指等待多少个单位when的时间后,Logger会自动重建文件
#   backupCount 是保留日志个数
log_file_handler = TimedRotatingFileHandler(
    filename = os.path.join(os.getcwd(), 'log.txt'),
    when = "D",
    interval = 1,
    backupCount = 60)
logging.getLogger().addHandler(log_file_handler)  # 实例化添加handler
# 添加控制台显示日志
console = logging.StreamHandler();
console.setLevel(logging.DEBUG);
formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s');
console.setFormatter(formatter);
logging.getLogger('').addHandler(console);

# 词典id
file_no_list = ["0", "1"]
# 允许的操作,1:增加词 2:删除词
operation_list = ["1", "2"]
# 词典映射
file = {}
file['0'] = "test1.txt"
file['1'] = "test2.txt"

class MyRequestHandler(BaseHTTPRequestHandler):
    # 请求响应
    def _write_resp(self, resp_code, msg):
        self.send_response(resp_code)
        self.send_header("Content-type", "text/html")
        self.end_headers()
        self.wfile.write(str(self.headers))
        self.wfile.write(msg)


    # Get请求的处理
    def do_GET(self):
        logging.info("Client %s request service, method %s, params %s", self.client_address, self.command, self.path)
        if self.client_address[0] not in WHITE_LIST:
            logging.warning("Client has no access right.")
            self._write_resp(403, "Please check access rights.")
            return
        datas = self.url2Dict(self.path)
        flag, file_no, operation, Words = self.check_params(datas)
        if not flag:
            logging.warning("Request params error.")
            self._write_resp(400, "Please check request params.")
            return
        res_code, msg = self.modify_Dict(file_no, operation, words)
        self._write_resp(res_code, msg)


    # url解析,将url解析转换成字典
    def url2Dict(self, url):
        query = urlparse.urlparse(url).query
        return dict([(k, v[0]) for k, v in urlparse.parse_qs(query).items()])


    # 参数校验
    def check_params(self, datas):
        file_no = datas.get("file_no", -1)
        if file_no == -1 or file_no not in file_no_list:
            logging.debug("Request params error --- file_no error.")
            return False, "", "", []
        operation = datas.get("operation", -1)
        if operation == -1 or operation not in operation_list:
            logging.debug("Request params error --- operation error.")
            return False, file_no, "", []
        words_tmp = datas.get("words", -1)
        if words_tmp == -1:
            logging.debug("Request params error --- words error.")
            return False, file_no, operation, []
        words = words_tmp.split(",")
        if len(words) < 1:
            logging.debug("Request params error --- words error.")
            return False, file_no, operation, []
        return True, file_no, operation, words


    # 更新词库操作
    def modify_Dict(self, file_no, operation, words):
        url = "git@GitHub.com:xingzhexiaozhu/UsefulProgram.git"
        file_path = os.path.abspath(".") + "/UsefulProgram/"
        data_path = file_path + file[file_no]

        # 拉取最新代码
        if not self.git_init(url, file_path):
            logging.error("Git init error.")
            return 500, "git init error."
        # 更新词库
        if not self.modify(data_path, operation, words):
            logging.error("Modify dict error.")
            return 500, "modify dict error."
        # 提交修改
        if not self.git_push(file_path, data_path):
            logging.error("Git push error.")
            return 500, "git push error."
        logging.debug("Everything done.")
        return 200, "Success."


    # 初始化操作
    def git_init(self, url, file_path):
        try:
            if os.path.exists(file_path): # 拉取过则每次更新前先 git pull
                os.system("git -C " + file_path + " pull origin master")
                logging.debug("git pull %s", file_path)
            else: # 否则更新前需要先 git clone
                os.system("git clone " + url)
                logging.debug("git clone %s", url)
            return True
        except:
            logging.error("git init error")
            return False



    # 更新词库
    def modify(self, data_path, operation, words):
        try:
            # 增加词
            if operation == '1':
                self.add_words(data_path, words)
            # 删除词
            elif operation == '2':
                self.del_words(data_path, words)
            logging.debug("Modify dict done.")
            return True
        except:
            logging.error("Modify dict error")
            return False


    # 修改完成后提交修改到对应的分支
    def git_push(self, file_path, data_path):
        try:
            path = os.getcwd()  # 获取当前路径
            os.chdir(file_path) # 进入要提交的仓库
            print(os.getcwd())
            print(file_path)
            print(data_path)
            os.system("git add " + data_path)
            os.system("git commit -m " + "update")
            os.system("git push origin master")
            os.getcwd()
            os.chdir(path)      # 返回之前的路径
            logging.debug("Git push done.")
            return True
        except:
            logging.error("git push error")
            return False


    # 增加词到词库
    def add_words(self, data_path, words):
        with open(data_path, 'a+') as file:
            for word in words:
                if len(word.strip()) != 0:
                    logging.info("insert word %s in file %s", word, data_path)
                    file.write(word)
                    file.write("\n")


    # 从词库中删除词
    def del_words(self, data_path, words):
        tmp_file = data_path + ".tmp"
        write_file = open(tmp_file, 'w')
        with open(data_path, 'r') as read_file:
            while True:
                line = read_file.readline()
                if line != '':
                    if len(line.strip()) != 0:
                        if line.strip() in words:
                            logging.info("delete word %s from %s", line, data_path)
                            continue
                        write_file.write(line)
                else:
                    break
        write_file.close()
        os.system("cp -rf " + tmp_file + " " + data_path)
        os.system("rm " + tmp_file)


if __name__=="__main__":
    server = HTTPServer(('', 8899), MyRequestHandler)
    print("Started http server ...")
    server.serve_forever()


--结束END--

本文标题: Python服务端开发

本文链接: https://lsjlt.com/news/184198.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python服务端开发
    之前的爬虫https://blog.csdn.net/column/details/17218.html几篇文章为Python实现客户端以Get/Post等方法请求服务。最近用Python写了一个服务,在此总结一下知识点:1、Python...
    99+
    2023-01-31
    服务端 Python
  • python web开发--web前端开
    ...
    99+
    2023-01-31
    python web
  • python开发Webservice服务
    Webservice 记录一下python开发 Web services跨平台,跨语言,跨设备之间的通信。 Web service 三要素 SOAP:SOAP协议 WSDL:Web service描述语言,我的理解是:你服务端的...
    99+
    2023-01-31
    python Webservice
  • Python开发端口扫描器
    首先是最常用的端口扫描器: 虽说有nmap等强大的工具,不过如果由于条件限制无法安装Nmap呢?   我这个脚本写的比较简单,默认扫描1-65535全部的端口 实际的话,可以根据需要自己修改脚本来实现定制化扫描 # -*- coding...
    99+
    2023-01-30
    扫描器 端口 Python
  • 云服务器如何开发端口
    要在云服务器上开发端口,你需要完成以下步骤:1. 登录到云服务器。使用你的云服务提供商提供的登录凭证或 SSH 密钥登录到云服务器。...
    99+
    2023-09-26
    云服务器
  • Java NIO服务器端开发详解
    一、NIO类库简介  1、缓冲区Buffer  Buffer是一个对象,包含一些要写入和读出的数据。  在NIO中,所有的数据都是用缓冲区处理的,读取数据时,它是从通道(Channel)直接读到缓冲区中,在写入数据时,也是从缓冲区写入到通道...
    99+
    2023-05-30
    java nio 服务器
  • JavaScript是不是服务端开发语言
    这篇文章主要为大家展示了“JavaScript是不是服务端开发语言”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript是不是服务端开发语言”这篇文...
    99+
    2024-04-02
  • 云服务器开发端口安全吗
    云服务器开发端口的安全性取决于多种因素,包括服务器的配置、操作系统的安全性、网络防火墙的设置以及应用程序的安全性等等。云服务器开发端...
    99+
    2023-09-23
    云服务器
  • go语言只能开发服务端吗
    不是。go语言还可以:1、开发分布式系统、数据库代理器、中间件等,例如Etcd。2、进行网络编程,包括Web应用、API应用、下载应用,而且Go内置的net/http包基本上把我们平常用到的网络功能都实现了。3、进行数据库操作。4、进行开发...
    99+
    2023-05-14
    go语言 Golang
  • python网络-TFTP客户端开发(2
    一、 TFTP协议介绍 TFTP(Trivial File Transfer Protocol,简单文件传输协议) 是TCP/IP协议族中的一个用来在客户端与服务器之间进行简单文件传输的协议 特点: 简单 占用资源小 适合传递小文件 适...
    99+
    2023-01-31
    客户端 网络 python
  • python后端开发需要学什么
    python 后端开发的基本技能包括:python 编程语言数据结构和算法关系型和非关系型数据库web 框架(django 或 flask)restful api 开发操作系统知识版本控...
    99+
    2024-04-20
    mysql linux python redis git docker mongodb
  • Node.js 服务器端应用开发框架 -- Hapi.js
    Hapi.js 是一个用来构建基于 Node.js 的应用和服务的富框架,使得开发者把重点放在便携可重用的应用逻辑而不是构建架构。内建输入验证、缓存、认证和其他 Web 应用开发常用的功能。 示例代码: ...
    99+
    2022-06-04
    服务器端 框架 Node
  • 初识NodeJS服务端开发入门(Express+MySQL)
    NodeJS对前端来说无疑具有里程碑意义,在其越来越流行的今天,掌握NodeJS已经不再是加分项,而是前端攻城师们必须要掌握的技能。本文将与同志们一起完成一个基于Express+MySQL的入门级服务端应用...
    99+
    2022-06-04
    服务端 入门 NodeJS
  • css是不是服务端的开发语言
    这篇“css是不是服务端的开发语言”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“css是不...
    99+
    2024-04-02
  • 抖音小程 服务端OpenAPI 开发示例
    开发流程如下图 为方便开发 我用的是沙盒模式 开放平台前三个接口开发流程如下,我的代码没做相关优化 代码如下 1、 接口调用凭证 //接口调用凭证 public function get...
    99+
    2023-08-31
    javascript json php
  • go语言能不能开发服务器端
    本文小编为大家详细介绍“go语言能不能开发服务器端”,内容详细,步骤清晰,细节处理妥当,希望这篇“go语言能不能开发服务器端”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。go语言能开发服务器端,其定位是用来开发“...
    99+
    2023-07-04
  • O2OA开发平台:Web端管理服务器
    平台提供web管理端方便快捷查看服务器当前状态,同时方便管理服务器。实现平台的易用性。第一:管理员通过浏览器登入系统后,点击应用中的日志图标。如下图所示:...
    99+
    2023-06-02
  • python开发前后端分离的好处
    这篇文章主要介绍“python开发前后端分离的好处”,在日常操作中,相信很多人在python开发前后端分离的好处问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python开发前后端分离的好处”的疑惑有所帮助!...
    99+
    2023-06-02
  • go语言是不是只能开发服务端
    本篇内容介绍了“go语言是不是只能开发服务端”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!不是。go语言还可以:1、开发分布式系统、数据库代...
    99+
    2023-07-04
  • 前端开发与后端开发的区别有哪些
    这篇文章主要介绍了前端开发与后端开发的区别有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 前端开发是什么前端称为客户端开发,你可以在应用程序或网站的屏幕上看到...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作