20190430更新

重要的内容放在最前面,本地调试好的程序要放公网服务器上,怎么就不好用了呢?服务也启动了,但是就是访问不了,

排除了防火墙的问题,后来对比了node app的启动方式,netstat -ntpl | grep 7777

找到了灵感,原来只要这么改一下就好了

before :host = ('localhost', 7777)
after:host = ('', 7777)

Http,互联网的基础

.net ,java(springboot),node.js,python 都能非常方便的实现http服务。

现在服务器后台跑着pytorch的模型,想着还是用python来处理文件上传请求吧,虽然其他语言之间的互相调用也没问题。

听说python的http服务对多线程支持不够,而且稳定性未知,但是不试试看怎么知道。

下面贴出代码,需要用的同志们随便用,因为我也是网上拼凑出来的代码。

服务器端:HttpServer.py

#! -*- coding:utf-8 -*-
__author__ = 'marszhang'
import cgi
import os
import http.server
import json
# import urlparse
import urllib.parse
from http.server import HTTPServer, BaseHTTPRequestHandler LOCAL_FOLDERS = [
"D:\\SIFT"
]
BASE_URL = "http://140.143.184.29"
data = {'result': 'this is a result','test': 'this is a test'}
host = ('localhost', 7777)
data_json = json.dumps({'key1':'value1','key2':'value2'}) #dumps:将python对象解码为json数据 class WebRequestHandler(http.server.BaseHTTPRequestHandler):
def do_GET(self):
print("Request for '%s' received." % self.path)
self.send_response(200)
self.send_header('Content-type', 'application/json')
self.end_headers()
self.wfile.write(json.dumps(data).encode())
def do_POST(self):
enc = "UTF-8"
path = str(self.path)
#获取POST请求的一种方式,首先受到length,然后通过self.rfile里读出该长度的数据
# length = int(self.headers["content-length"]) # 获取除头部后的请求参数的长度
# datas = urllib.parse.parse_qs(self.rfile.read(length), keep_blank_values=1) # 获取请求参数数据,请求数据为json字符串
# print(datas)
if path == "/data":
# pass(可以添加对参数的逻辑处理)
# 以下是返回报文
self.send_response(200) # 返回状态码
self.send_header("Content-type", "text/html;charset=%s" % enc) # 返回响应头内容
self.end_headers() # 返回响应头结束
buf = {"status": 0, # 返回包体数据
"data": {"filepath": "返回成功"}}
#这里一定要加encode(),不然会报错,bytes<-> str转换的错,bytes和str的互转有三种方式,# s.encode(encoding="utf-8")
self.wfile.write(json.dumps(buf).encode()) # 发送json格式的返回包体
# 上传图片
if path == "/upload":
form = cgi.FieldStorage(
fp=self.rfile,
headers=self.headers,
environ={'REQUEST_METHOD': 'post',
'CONTENT_TYPE': self.headers['Content-Type']
}
)
datas = form['file'].value # 获取上传文件内容
fname = self.headers["filename"]
fn = os.path.join("D:\\study\\", fname) # 生成文件存储路径
outf = open(fn, 'wb') # 写打开文件
outf.write(datas) # 将接收到的内容写入文件
outf.close() # 关闭文件
self.send_response(200)
self.send_header("Content-type", "text/html;charset=%s" % enc)
self.send_header("test", "This is test!")
self.end_headers()
buf = {"status": 0,
"data": {
"msg": u"上传成功"}}
self.wfile.write(json.dumps(buf))
if __name__ == '__main__':
try:
server = HTTPServer(host, WebRequestHandler)
print("Starting server, listen at: %s:%s" % host)
server.serve_forever()
except KeyboardInterrupt:
print('shutdong doen server')
server.socket.close()

客户端:Httpclient.py

#coding=utf-8
import requests
url = "http://localhost:7777/upload"
path = "D:\\test\\1\\20190329180730.png"
print(path)
files = {'file': open(path, 'rb')}
headers = {"filename":"20190329180730.png"}
r = requests.post(url, files=files,headers=headers)
print(r.url)
print(r.text) 需要注意的是,python通过requests发送post请求,通常可以有以下三种方式,当然不用客户端来发请求,用postman来发请求也可以,

A:application/x-www-form-urlencoded ==最常见的post提交数据的方式,以form表单形式提交数据

data = {'key1':'value1','key2':'value2'}
=requests.post(url,data)

B:application/json    ==以json格式提交数据

data_json = json.dumps({'key1':'value1','key2':'value2'})   #dumps:将python对象解码为json数据
r_json = requests.post(url,data_json)

C:multipart/form-data  ==一般使用来上传文件(较少用)

files = {'file':open('E://report.txt','rb')}
= requests.post(url,files=files)

此时,如果需要传一些其他参数,也有很多种办法,这篇博文已经讲得非常全面了,https://www.cnblogs.com/puresoul/p/7488700.html

有八种

  1、带数据的post ->见上面例子A

  2、带header的post   ->见下面例子

  3、带json的post ->见上面例子B

  4、带参数的post

      params = {'key1':'params1','key2':'params2'}
      r = requests.post(url,params=params)

  5、普通文件上传 ->见上面例子C

  6、定制化文件上传

     files = {'file':('test.png',open('test.png','rb'),'image/png')}
r = requests.post(url,files=files)

  7、多文件上传

     files = [('file1',('test.txt',open('test.txt', 'rb'))),
('file2', ('test.png', open('test.png', 'rb')))]
r = requests.post(url,files=files)

  8、流式上传


     with open( 'test.txt' ) as f:
r = requests.post(url,data = f)

我习惯把参数放到header里,比如

files = {'file': open(path, 'rb')}
headers = {"filename":"20190329180730.png"}
r = requests.post(url, files=files,headers=headers)

这样文件名和文件都传过去了。

关于python 的http 日常操作的更多相关文章

  1. python专题我对json的日常操作

    一前言 本篇文章将会阐述对json的日常操作,如何读取json文件,将json文件转为字典:如何将字典转为json,将字典写入文件等: 二 josn数据格式简要说明 json对于初学者可以理解是一种数 ...

  2. python 历险记(三)— python 的常用文件操作

    目录 前言 文件 什么是文件? 如何在 python 中打开文件? python 文件对象有哪些属性? 如何读文件? read() readline() 如何写文件? 如何操作文件和目录? 强大的 o ...

  3. Python开发【第三篇】:Python基本之文件操作

    Python基本之文本操作 一.初识文本的基本操作 在python中打开文件有两种方式,即:open(...) 和  file(...) ,本质上前者在内部会调用后者来进行文件操作,推荐使用 open ...

  4. 【Python数据分析】Python3操作Excel(二) 一些问题的解决与优化

    继上一篇[Python数据分析]Python3操作Excel-以豆瓣图书Top250为例 对豆瓣图书Top250进行爬取以后,鉴于还有一些问题没有解决,所以进行了进一步的交流讨论,这期间得到了一只尼玛 ...

  5. [python]用Python进行SQLite数据库操作

    用Python进行SQLite数据库操作 1.导入Python SQLITE数据库模块 Python2.5之后,内置了SQLite3,成为了内置模块,这给我们省了安装的功夫,只需导入即可~  ]: u ...

  6. python学习笔记:文件操作和集合(转)

    转自:http://www.nnzhp.cn/article/16/ 这篇博客来说一下python对文件的操作. 对文件的操作分三步: 1.打开文件获取文件的句柄,句柄就理解为这个文件 2.通过文件句 ...

  7. python os&shutil 文件操作

    python os&shutil 文件操作 # os 模块 os.sep 可以取代操作系统特定的路径分隔符.windows下为 '\\' os.name 字符串指示你正在使用的平台.比如对于W ...

  8. python对mysql数据库操作的三种不同方式

    首先要说一下,在这个暑期如果没有什么特殊情况,我打算用python尝试写一个考试系统,希望能在下学期的python课程实际使用,并且尽量在此之前把用到的相关技术都以分篇博客的方式分享出来,有想要交流的 ...

  9. Python实现浏览器自动化操作

    Python实现浏览器自动化操作 (2012-08-02 17:35:43) 转载▼     最近在研究网站自动登录的问题,涉及到需要实现浏览器自动化操作,网上有不少介绍,例如使用pamie,但是只是 ...

随机推荐

  1. iOS 开发笔记 - 导航到地图

    导航到地图,已经不是什么新鲜事了.网上有好多参考的资料,我总结出只需要两步 第一步:在info中加上支持的各平台 比如:iosamap高德地图.comgooglemaps谷歌地图.baidumap百度 ...

  2. 完整工程,deeplab v3+(tensorflow)代码全理解及其运行过程,长期更新

    前提:ubuntu+tensorflow-gpu+python3.6 各种环境提前配好 1.下载工程源码 网址:https://github.com/tensorflow/models 下载时会遇到速 ...

  3. 《linux就该这么学》第十一节课: 第九章,网卡绑定与sshd服务

    8.4.服务的访问控制列表 TCPwrappers是RHEL7中默认启用的流量监控程序,能够对服务做出允许或拒绝. TCPwrappers服务由两个文件控制:  /etc/hosts.allow    ...

  4. java快排思想

    1分治思想 1.1比大小在分区 1.2从数组中取出一个数做基准数 1.3将比他小的数全放在他的左边,比他大的数全放在他的右边 1.4然后递归 左边 和右边 }

  5. SQL的优化整理

    1,对查询进行优化,要尽量避免全表扫描,首先应考虑在进行条件判断的字段上创建索引 (注意:如果一张数据表中的数据更新频率太高,更新数据之后需要重新创索引,这个过程很耗费性能,所以更新频率高的数据表慎用 ...

  6. Unity如何退出游戏

    使用 Application.Quit(),但在 editor 模式下使用 Application.Quit()是没用的,要用 EditorApplication.isPlaying = false. ...

  7. node多人聊天室搭建

    1.采用websocket: 为什么不用ajax的http:在用HTTP发送消息时,必须用一个新的TCP/IP连接.打开和关闭连接需要时间.此 外,因为每次请求都要发送HTTP头,所以传输的数据量也比 ...

  8. java中String字符串的==解析

    今天不知道怎么看了下string的==的问题,本身我觉得我这个水平去判断几个字符串相等还能出问题?呵呵,真的出了大问题,根本原因在于对java字节码的不了解. 首先,==运算符比较的是两个变量所指向的 ...

  9. localStorage,sessionStorage和cookie的区别

    sessionStorage 和 localStorage 是HTML5 Web Storage API 提供的,可以方便的在web请求之间保存数据.有了本地数据,就可以避免数据在浏览器和服务器间不必 ...

  10. 博客系统(cnblog)

    1.用户表:Userinfo 2.博客站点表:Blog 3.标签表:Tag 4.分类表:Category 5.文章表:Article 6.点赞踩表:ArticelUpDown 7.评论表:Commen ...