如何python搭建简单的服务,并实现post、get功能

如何python搭建简单的服务,并实现post、get功能

问题背景

两台机器,其中一台机器A需要计算,并且时刻把结果传输到另一台机器B上。

最simple的方式,机器B搭建一个系列公共目录,其中一个设置A有权限读写。A挂在B的公共目录,把计算结果写进去。B监控公共目录,当有新的内容写入时,读取文件,当然,此处要考虑锁的问题。这里,反过来把公共目录放在B上也是一样的。这种场景下如果一台机器是段侧机器,一台是服务器,那么,在段侧去存放这种目录,需要记得设置文件存储时间、大小,最好写入信息的时候,就查看总的文件大小,免得磁盘写满。

正常情况下,在A或B上假设一个服务,另一台机器去访问就好了。如果是A做计算,相当于A先得到消息,B后得到消息。那么,B上架一个服务,用A去访问它是比较合适的。如果条件允许,在B上同时搞一个数据库存储结果和后续状态,我觉得也是不错的。

这里,只讲讲怎么在B上搭建服务,在A上创建请求。

工具
  1. python IDE,此处选择了pycharm
  2. postman,下载地址:https://www.getpostman.com/downloads/
参考
  1. https://www.jianshu.com/p/279473392f38 【主要参考这个】
  2. https://blog.csdn.net/huaxiawudi/article/details/81612831 【简单看看作为理解,实际用还有很多需要补充】
搭建服务

服务就是,运行一个程序,等待发信任给我发数据,我读到这些数据,做出处理,处理完成后,回复一些数据。
在上面的场景中,就是A计算将结果发给B,B得到消息后做处理,处理之后给A回复一条消息,A看到消息,就知道给B的信B已经收到了。
github上的大神分享了自己的code,参考1中有解读。实际操作过程如下。
讲下面代码运行,将架起一个服务。

  • 搭建服务
from http.server import BaseHTTPRequestHandler, HTTPServer
import logging


class S(BaseHTTPRequestHandler):
    def do_HEAD(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()

    def do_GET(self):
        paths = {
            '/foo': {'status': 200},
            '/bar': {'status': 302},
            '/baz': {'status': 404},
            '/qux': {'status': 500}
        }

        if self.path in paths:
            self.respond(paths[self.path])
        else:
            self.respond({'status': 500})
        logging.info("GET request,\nPath: %s\nHeaders:\n%s\n", str(self.path), str(self.headers))
        self.wfile.write("GET request for {}".format(self.path).encode('utf-8'))

    def do_POST(self):
        content_length = int(self.headers['Content-Length']) # <--- Gets the size of data
        post_data = self.rfile.read(content_length) # <--- Gets the data itself

        logging.info("POST request,\nPath: %s\nHeaders:\n%s\n\nBody:\n%s\n",
                str(self.path), str(self.headers), post_data.decode('utf-8'))

        res = "You Input: " + post_data.decode('utf-8')

        self.do_HEAD()
        # self.wfile.write("POST request for {}".format(self.path).encode('utf-8'))
        self.wfile.write("{}".format(res).encode('utf-8'))
        # self.wfile.write("POST request for {ASS}".format(data).encode('utf-8'))

    def respond(self, opts):
        response = self.handle_http(opts['status'], self.path)
        self.wfile.write(response)

    def handle_http(self, status_code, path):
        self.send_response(status_code)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        content = '''
           <html><head><title>Title goes here.</title></head>
           <body><p>This is a test.</p>
           <p>You accessed path: {}</p>
           </body></html>
           '''.format(path)
        return bytes(content, 'UTF-8')


def run(server_class=HTTPServer, handler_class=S, port=8080):
    print("run()")
    logging.basicConfig(level=logging.INFO)
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    logging.info('Starting httpd...\n')
    try:
        httpd.serve_forever()
    except KeyboardInterrupt:
        pass
    httpd.server_close()
    print("httpd.server_close()")
    logging.info('Stopping httpd...\n')


if __name__ == '__main__':
    from sys import argv

    if len(argv) == 2:
        run(port=int(argv[1]))
    else:
        run()

当运行这段程序后,你可以利用postman创建一个post查看这个服务的效果。
记得要运行此程序,不要退出。服务就是一个一直在运行的程序。

查看服务的结果

首先看看你的ip地址,windows,cmd,ipconfig,得到我的本机地址是:192.168.1.108。
然后在postman中根据代码中写入的端口号8080,填写被访问的地址http://192.168.1.108:8080/TestServer,如果你不写后面的后缀,也是可以的,http://192.168.1.108:8080,可以试试会看到什么。这个url后缀,会在上面的服务中被解析,相当于处理服务的不同情况。
截图如下,在这里插入图片描述

python实现post

在上面的场景中,如果B机器假设了服务,那么A机器该如何利用python实现postman这样一个动作呢?postman和K神已经帮我们解决了这个问题。操作如下
在这里插入图片描述
那么,其中的code如下

import requests

url = "http://192.168.1.108:8080/TestServer"

payload = "abcdddddEEEE"
headers = {
    'Content-Type': "text/plain",
    'User-Agent': "PostmanRuntime/7.15.0",
    'Accept': "*/*",
    'Cache-Control': "no-cache",
    'Postman-Token': "d5639969-8fbd-4531-9ad5-9a1bbe99089a,0c1fee63-a3e2-4a81-89ea-8b8861a0aa61",
    'Host': "192.168.1.108:8080",
    'accept-encoding': "gzip, deflate",
    'content-length': "12",
    'Connection': "keep-alive",
    'cache-control': "no-cache"
    }

response = requests.request("POST", url, data=payload, headers=headers)

print(response.text)

运行这段代码就实现了一个post功能。

或者,你用下面的这段代码也是可以的。都来自postman。

import http.client

conn = http.client.HTTPConnection("192,168,1,108")

payload = "abcdddddEEEE"

headers = {
    'Content-Type': "text/plain",
    'User-Agent': "PostmanRuntime/7.15.0",
    'Accept': "*/*",
    'Cache-Control': "no-cache",
    'Postman-Token': "b695333f-e7e4-4926-8824-aea76482402b,48e619a9-f5a1-4898-9184-57cde4d72d89",
    'Host': "192.168.1.108:8080",
    'accept-encoding': "gzip, deflate",
    'content-length': "24",
    'Connection': "keep-alive",
    'cache-control': "no-cache"
    }

conn.request("POST", "TestServer", payload, headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
总结

按照以上的过程,你应该可以搞定一个python搭建服务,python实现post的基本功能。web服务和访问有很多内容,此处只是应急的自己玩玩的小功能。

  • 17
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
# RESRful-API-with-vuejs 基于Python Flask的简易RESTful API接口,可实现基本的前后端分离。 ### 服务器端 采用Python Flask框架搭建基本api,可实现GET、POST、PUT、DELETE方法,为前端提供API接口。 片段: ```python #GET方法api @app.route('/todo/api/tasks', methods=['GET']) def getTasks(): return jsonify({'tasks': tasks}) ``` ### 前端 通过发送HTTP请求进行数据交互,此处使用vue.js框架进行示例,使用vue-resource发送HTTP请求。 片段: ```javascript compiled: function() { var self = this; //在编译后即调用API接口取得服务器端数据 self.$http.get('/todo/api/tasks').then(function(res) { self.tasks = res.data.tasks; }); }, ``` ### 项目依赖 * Python flask(请使用pip进行安装) * vue.js * vue-resource ### 运行 ``` python3 ./app.py ``` 打开浏览器,进入http://127.0.0.1:5000/ #### 备注(在virtualenv环境下运行的方法) 1、安装virtualenv ```shell $ pip3 install virtualenv ``` 2、创建项目目录 ```shell $mkdir project-name && cd project-name ``` 3、建立名为venv的虚拟环境 ```shell $virtualenv --no-site-packages venv ``` 4、进入虚拟环境 ```shell $source venv/bin/activate ``` 5、运行项目 ```shell (venv)python3 app.py ``` 6、退出虚拟环境 ```shell $deactivate ``` -------- 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! <项目介绍> 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------
# 图书管理系统说明V2.0 ### 项目介绍及再版说明(2016-01-24) 其实一开始做这个小项目在2014年的9到11月,当时是作为加入Pureweber开发组的大作业完成的。虽然用了两个月的时间,但是做出的东西还是有很多的缺陷。前些日子在整理GitHub时又想起来了这个项目,记得曾经还在Django中国社区里安利初学者来读代码什么的。但是想想里面还有很多不规范的代码和一些很糟糕的写法就感觉很蛋疼。本来想直接删除了好了,但是后来想想,何不花点时间把这个小项目重构一下,就可以给以后学习Django的同学一个完整的项目参考,就可以代替了一般培训课程或者老师上课PPT里那种陈旧或者不完整的例子。 于是一共花费了大约两天时间对项目进行了重构,主要做了以下方面的工作: * 将Django的版本更新到了最新的1.9.1。 * 修改了原先项目中不规范的格式、变量名等。 * 更改了项目的目录结构,换成了Django官方推荐的目录结构模式。 * 将原来缺失的文件上传保存部分补充完整了。 * 更改了用户部分的代码,将原来手动设置session的方式去掉了,替换为Django用户模块默认的登录态保存方式. * 修复了注册用户时用户提交空密码可能造成的安全漏洞。 * 做了对python3的支持。改动不多。 ### 项目所涉及的和Django相关的功能 项目的目的是为了给Django的初学者一个完整项目的参考案例,所以尽可能多的选择了初学者常用的方法处理一些问题,比如在视图的处理上选择了视图处理函数,而不是更好用的视图处理类。在参数传递上只使用了标准的POST和GET的方式传参,而没有使用url地址中提取参数的办法。该项目中主要涉及到的Django框架相关的内容有: * Models模型字段用法,外键关系用法。 [文档](https://docs.djangoproject.com/en/1.9/topics/db/models/) * 使用ORM进行数据库查询。 [文档](https://docs.djangoproject.com/en/1.9/topics/db/queries/) * Urls配置文件的写法,Urls命名与反向查询。 [文档](https://docs.djangoproject.com/en/1.9/topics/http/urls/) * Views视图处理函数。 [文档](https://docs.djangoproject.com/en/1.9/topics/http/views/) * Templates模板。 [文档](https://docs.djangoproject.com/en/1.9/ref/templates/language/) * 在admin站点中注册模型。 [文档](https://docs.djangoproject.com/en/1.9/ref/contrib/admin/) * Django自带用户模块的注册和登录。 [文档](https://docs.djangoproject.com/en/1.9/topics/auth/default/) * 对Django自带的用户模块进行拓展。 [文档](https://docs.djangoproject.com/en/1.9/topics/auth/customizing/) * 静态文件处理。 [文档](https://docs.djangoproject.com/en/1.9/ref/contrib/staticfiles/) * 还有一大堆其他的…… ### 系统说明 * 本系统使用Python的Django框架搭建。 * 前端部分使用bootstrap。 ### 运行说明 * 请参考Django官方文档[下载](https://www.djangoproject.com/download/)Django1.711.9.1版。 * 请按照Django官方文档[安装](https://docs.djangoproject.com/en/1.9/intro/install/)Django。 * 如果是水果电脑。。。请额外安装[PIL](http://www.pythonware.com/products/pil/)库。 * 通过终端进入项目文件夹。 * 在终端中执行`python manage.py runserver`命令即可运行本地开发服务器。 * 在浏览器里访问`http://127.0.0.1:8000`即可查看该网站。 ### 功能实现 * 实现了用户权限相关的基本操作(注册、登陆、修改密码、注销) * 实现了用户分级(普通用户与管理员用
Python可以通过多种方式搭建服务器。最常见的一种方式是使用Python内置的`http.server`模块。这个模块是Python标准库的一部分,提供了一个简单的HTTP服务器类。通过创建一个继承自该类的子类并实现相应的处理程序,我们可以轻松地搭建一个基本的服务器。 首先,我们需要在终端中使用`python -m http.server`命令启动一个简单服务器。这将在本地8000端口启动一个默认的服务器,并监听来自客户端的请求。接着,我们可以在浏览器中输入`http://localhost:8000`来访问服务器返回的默认页面。 除了使用默认的处理程序外,我们还可以自定义处理程序来处理不同类型的请求。比如,我们可以创建一个自定义的处理程序类,继承自`http.server.BaseHTTPRequestHandler`。在这个类中,我们可以重写`do_GET`、`do_POST`等方法,以处理相应类型的请求。然后,我们可以在启动服务器时传入这个自定义的处理程序类,以便使用自定义的逻辑来处理客户端请求。 另外,如果希望服务器能够同时处理多个请求,可以使用Python的多线程或多进程支持。通过创建多个线程或进程,并将每个线程或进程绑定到不同的端口上,就可以同时处理多个请求了。 总而言之,Python提供了简单易用的工具和库,可以轻松地搭建服务器。通过灵活运用Python的各种模块和功能,我们可以根据自己的需求搭建出各种复杂的服务器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值