鱼C论坛

 找回密码
 立即注册
查看: 2591|回复: 2

求助 PYTHON XMLRPC 的使用

[复制链接]
发表于 2015-5-11 22:49:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
    我选了PYTHON的选修课,想做一个XMLRPC的那个项目,在并不是很懂的情况下,连学带抄写出了程序,但是对于报错,我实在是看不懂呀,求指教啦。
先贴SERVER.PY
  1. #coding=utf-8

  2. from xmlrpclib import ServerProxy,Fault
  3. from os.path import join, abspath,isfile
  4. from SimpleXMLRPCServer import SimpleXMLRPCServer
  5. from urlparse import urlparse
  6. import sys

  7. SimpleXMLRPCServer.allow_reuse_address = 1

  8. MAX_HISTORY_LENGTH = 6

  9. UNHANDLED = 100
  10. ACCESS_DENIED = 200

  11. class UnhandledQuery(Fault):
  12.     '''
  13.     that's show can't handle the query exception
  14.     '''
  15.     def __init__(self,message="Couldn't handle the query"):
  16.         Fault.__init__(self, UNHANDLED, message)

  17. class AccessDenied(Fault):
  18.     '''
  19.     when user try to access the forbiden resources raise exception
  20.     '''
  21.     def __init__(self, message="Access denied"):
  22.         Fault.__init__(self, ACCESS_DENIED, message)

  23. def inside(dir,name):
  24.     '''
  25.     check the dir that user defined is contain the filename the user given
  26.     '''
  27.     dir = abspath(dir)
  28.     name = abspath(name)
  29.     return name.startswith(join(dir,''))
  30. def getPort(url):
  31.     '''
  32.     get the port num from the url
  33.     '''
  34.     name = urlparse(url)[1]
  35.     parts = name.split(':')
  36.     return int(parts[-1])

  37. class Node:

  38.     def __init__(self, url, dirname, secret):
  39.         self.url = url
  40.         self.dirname = dirname
  41.         self.secret = secret
  42.         self.known = set()

  43.     def query(self, query, history = []):
  44.         try:
  45.             return self._handle(query)
  46.         except UnhandledQuery:
  47.             history = history + [self.url]
  48.             if len(history) > MAX_HISTORY_LENGTH: raise
  49.             return self._broadcast(query,history)

  50.     def hello(self,other):
  51.         self.known.add(other)
  52.         return 0
  53.     def fetch(self, query, secret):

  54.         if secret != self.secret: raise
  55.         result = self.query(query)
  56.         f = open(join(self.dirname, query),'w')
  57.         f.write(result)
  58.         f.close()
  59.         return 0

  60.     def _start(self):
  61.         s = SimpleXMLRPCServer(("",getPort(self.url)),logRequests=False)
  62.         s.register_instance(self)
  63.         s.serve_forever()

  64.     def _handle(self, query):
  65.         dir = self.dirname
  66.         name = join(dir, query)
  67.         if not isfile(name):raise UnhandledQuery
  68.         if not inside(dir,name):raise AccessDenied
  69.         return open(name).read()

  70.     def _broadcast(self, query, history):

  71.         for other in self.known.copy():
  72.             if other in history: continue
  73.             try:
  74.                 s = ServerProxy(other)
  75.                 return s.query(query, history)
  76.             except Fault, f:
  77.                 if f.faultCode == UNHANDLED:pass
  78.                 else: self.known.remove(other)
  79.             except:
  80.                 self.known.remove(other)

  81.         raise UnhandledQuery

  82. def main():
  83.     url, directory, secret = sys.argv[1:]
  84.     n = Node(url,directory,secret)
  85.     n._start()

  86. if __name__ == '__main__': main()
复制代码

再是client。py
  1. #coding=utf-8

  2. from xmlrpclib import ServerProxy, Fault
  3. from cmd import Cmd
  4. from random import choice
  5. from string import lowercase
  6. from server import Node,UNHANDLED  #引入前面的server
  7. from threading import Thread
  8. from time import sleep

  9. import sys

  10. HEAD_START = 0.1
  11. SECRET_LENGTH = 100

  12. def randomString(length):
  13.     chars = []
  14.     letters = lowercase[:26]
  15.     while length > 0:
  16.         length -= 1
  17.         chars.append(choice(letters))
  18.     return ''.join(chars)

  19. class Client(Cmd):
  20.     prompt = '> '

  21.     def __init__(self, url, dirname, urlfile):

  22.         Cmd.__init__(self)
  23.         self.se<span style="line-height: 1.5;">cret = randomString(SECRET_LENGTH)</span>
复制代码

最后就是凄惨的报错



QQ截图20150511224012.png



求帮助,感激感激!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-5-12 00:10:13 | 显示全部楼层
楼主的两个报错的解释:
1、invalid literal for int() with base 10
意思是int()函数的传入参数不对,你的程序我没有细看,所以不知道报错的这句return int(parts[-1])里part[-1]是什么类型的变量(我猜测是一个字符串吧,所以下面的举例我用字符串举例),假如part[-1]是一个字符串"4.5",想用int()函数将其转化为整形就会报错,因为字符串中存放的是一个浮点型的数
2、No such file or directory
意思是没有相应的文件或目录,也就是说程序没有找到你想要的这个文件urlsA.txt,这种直接用文件名来调用open()函数的方法,需要将文件直接放在代码程序同一目录下,否则请用绝对路径(比如,主在D盘根目录下,r"D:\urlsA.txt"),记得当使用的路径字符串中包含\时,在字符串前加r,即告诉程序这个字符串中的\不是转义标识符。另外如果你已经将文件放在同一目录下,请使用绝对路径试一试
PS:在初学时,遇到错误信息只需要将错误信息放到百度里搜一下,就能大概知道这个错误的原因,然后再根据它去找你程序当中的逻辑错误,很少有人会愿意去看你的大段程序,然后弄清你想干 什么,再帮你把程序调通的,加油学习吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-12 12:01:38 From FishC Mobile | 显示全部楼层
lightninng 发表于 2015-5-12 00:10
楼主的两个报错的解释:
1、invalid literal for int() with base 10
意思是int()函数的传入参数不对,你 ...

谢谢 我知道了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-16 02:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表