python3 写的服务器 访问py文件,为什么不会执行,而全部打印到屏幕上了

LinDRon 2017-06-30 05:03:40
python3 写的服务器 访问py文件,为什么不会执行,而全部打印到网页上了


import sys
import socket
import multiprocessing

import re


HTTP_SEVER_DIR = '.'

class HTTPserver(object):
def __init__(self,port):
self.server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
self.server_socket.bind(('',port))
self.server_socket.listen(5)
self.response_headers = ''

def start_response(self,status,headers):
response_headers = 'HTTP 1.1 %s\r\n'%status
for header in headers:
response_headers = response_headers + '%s:%s'%(header[0],header[1]) + '\r\n'

self.response_headers = response_headers

def handle_client(self,client_socket):
request_data = client_socket.recv(1024).decode('utf-8')
print(request_data)
request_start_line = request_data.splitlines()[0]
file_name = re.match(r'\w+ +(/[^ ]*) ',request_start_line).group(1)
print(file_name)
#file_name = request_start_line
if file_name.endswith('.py'):
m = __import__(file_name[1:-3])
env = {
}
response_body = m.application(env,self.start_response)
response_data = self.response_headers +'\r\n' + response_body

elif '/' == file_name:
file_name = 'index.html'

try:
with open(HTTP_SEVER_DIR + file_name,'rb') as f:
file_data = f.read()
f.close()
except:
response_start_line = 'HTTP 1.1 200 OK\r\n'
response_headers = 'Server Lindr\r\n'
response_body = '\r\nThis file is not found'
response_data = response_start_line + response_headers + response_body

else:

response_start_line = 'HTTP 1.1 200 OK\r\n'
response_headers = 'Server Lindr\r\n'
response_body = '\r\n' + file_data.decode('utf-8')
#response_headers = '\r\nhello word3
response_data = response_start_line + response_headers + response_body

client_socket.send(response_data.encode('gbk'))
client_socket.close()


def start(self):
while 1:
client_socket,client_addr = self.server_socket.accept()
print('[%s,%s]用户上线了'%client_addr)

server_process = multiprocessing.Process(target=self.handle_client,args=(client_socket,))
server_process.start()
client_socket.close()


def main():
http_sever = HTTPserver(8888)
http_sever.start()

if __name__ == '__main__':
main()
...全文
392 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
LinDRon 2017-08-13
  • 打赏
  • 举报
回复
就是在response的headers中的Content-type 类型修改一下就可以了
qq_36158278 2017-07-10
  • 打赏
  • 举报
回复
请问是怎么解决的啊?我也遇到这个问题了
LinDRon 2017-07-09
  • 打赏
  • 举报
回复
引用 2楼混沌鳄鱼 的回复:
楼主是不是太小白了?刚开始学吧? 那大段代码写的就是一个web server, 按请求的文件名把文件内容推送给浏览器. 要想执行调用的文件,要在web server里用代码来调用. 把这段 with open(HTTP_SEVER_DIR + file_name,'rb') as f: file_data = f.read() f.close() 改成execfile('m_time.py') 如果有标准输出 import os return_msg = os.popen('python m_time.py') print return_msg.read()
我调用程序的代码是if 第一个判断 m.application(env,star_response)这里

你说的地方只是读取html文件的
LinDRon 2017-07-08
  • 打赏
  • 举报
回复
@xpresslink 我调用程序的代码是if 第一个判断 m.application(env,star_response)这里 你说的地方只是读取html文件的
LinDRon 2017-07-08
  • 打赏
  • 举报
回复
我调用程序的代码是if 第一个判断 m.application(env,star_response)这里 你说的地方只是读取html文件的
混沌鳄鱼 2017-07-03
  • 打赏
  • 举报
回复
楼主是不是太小白了?刚开始学吧? 那大段代码写的就是一个web server, 按请求的文件名把文件内容推送给浏览器. 要想执行调用的文件,要在web server里用代码来调用. 把这段 with open(HTTP_SEVER_DIR + file_name,'rb') as f: file_data = f.read() f.close() 改成execfile('m_time.py') 如果有标准输出 import os return_msg = os.popen('python m_time.py') print return_msg.read()
zhangyiant 2017-07-02
  • 打赏
  • 举报
回复
你在判断是否是.py文件的if条件里面打个log,或者设置断点,看看有没有进入那个分支。

37,743

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧