Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > HTTPserver: how to access variables of a higher class?

Reply
Thread Tools

HTTPserver: how to access variables of a higher class?

 
 
Tom P
Guest
Posts: n/a
 
      04-05-2013
First, here's a sample test program:
<code>
import sys
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler

class MyRequestHandler(BaseHTTPRequestHandler, object):
def do_GET(self):
top_self = super(MyRequestHandler, self) # try to access
MyWebServer instance
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
self.wfile.write("thanks for trying, but I'd like to get at
self.foo and self.bar")
return

class MyWebServer(object):
def __init__(self):
self.foo = "foo" # these are what I want to access from inside
do_GET
self.bar = "bar"
self.httpd = HTTPServer(('127.0.0.1', 8000), MyRequestHandler)
sa = self.httpd.socket.getsockname()
print "Serving HTTP on", sa[0], "port", sa[1], "..."

def runIt(self):
self.httpd.serve_forever()

server = MyWebServer()
server.runIt()

</code>

I want to access the foo and bar variables from do_GET, but I can't
figure out how. I suppose this is something to do with new-style vs.
old-style classes, but I lost for a solution.
 
Reply With Quote
 
 
 
 
Dave Angel
Guest
Posts: n/a
 
      04-05-2013
On 04/05/2013 07:02 AM, Tom P wrote:
> First, here's a sample test program:
> <code>
> import sys
> from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
>
> class MyRequestHandler(BaseHTTPRequestHandler, object):
> def do_GET(self):
> top_self = super(MyRequestHandler, self) # try to access
> MyWebServer instance
> self.send_response(200)
> self.send_header('Content-type', 'text/html')
> self.end_headers()
> self.wfile.write("thanks for trying, but I'd like to get at
> self.foo and self.bar")
> return
>
> class MyWebServer(object):
> def __init__(self):
> self.foo = "foo" # these are what I want to access from inside
> do_GET
> self.bar = "bar"
> self.httpd = HTTPServer(('127.0.0.1', 8000), MyRequestHandler)
> sa = self.httpd.socket.getsockname()
> print "Serving HTTP on", sa[0], "port", sa[1], "..."
>
> def runIt(self):
> self.httpd.serve_forever()
>
> server = MyWebServer()
> server.runIt()
>
> </code>
>
> I want to access the foo and bar variables from do_GET, but I can't
> figure out how. I suppose this is something to do with new-style vs.
> old-style classes, but I lost for a solution.


It'd have been good to tell us that this was on Python 2.7

Is MyWebServer class intended to have exactly one instance? If so, you
could save the instance as a class attribute, and trivially access it
from outside the class.

If it might have more than one instance, then we'd need to know more
about the class BaseHTTPServer.HTTPServer, From a quick glance at the
docs, it looks like you get an attribute called server. So inside the
do_GET() method, you should be able to access self.server.foo and
self.server.bar

See http://docs.python.org/2/library/basehttpserver.html

--
DaveA
 
Reply With Quote
 
 
 
 
Dylan Evans
Guest
Posts: n/a
 
      04-05-2013
On 05/04/2013 9:09 PM, "Tom P" <(E-Mail Removed)> wrote:
>
> First, here's a sample test program:
> <code>
> import sys
> from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
>
> class MyRequestHandler(BaseHTTPRequestHandler, object):
> def do_GET(self):
> top_self = super(MyRequestHandler, self) # try to access

MyWebServer instance
> self.send_response(200)
> self.send_header('Content-type', 'text/html')
> self.end_headers()
> self.wfile.write("thanks for trying, but I'd like to get at

self.foo and self.bar")
> return
>
> class MyWebServer(object):
> def __init__(self):
> self.foo = "foo" # these are what I want to access from inside

do_GET
> self.bar = "bar"
> self.httpd = HTTPServer(('127.0.0.1', 8000), MyRequestHandler)
> sa = self.httpd.socket.getsockname()
> print "Serving HTTP on", sa[0], "port", sa[1], "..."
>
> def runIt(self):
> self.httpd.serve_forever()
>
> server = MyWebServer()
> server.runIt()
>
> </code>
>
> I want to access the foo and bar variables from do_GET, but I can't

figure out how. I suppose this is something to do with new-style vs.
old-style classes, but I lost for a solution.

Consider inheriting HTTPServer in MyWebServer which is passed to the
request handler.

> --
> http://mail.python.org/mailman/listinfo/python-list


 
Reply With Quote
 
Tom P
Guest
Posts: n/a
 
      04-05-2013
On 04/05/2013 02:27 PM, Dylan Evans wrote:
> On 05/04/2013 9:09 PM, "Tom P" <(E-Mail Removed)> wrote:
>>
>> First, here's a sample test program:
>> <code>
>> import sys
>> from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
>>
>> class MyRequestHandler(BaseHTTPRequestHandler, object):
>> def do_GET(self):
>> top_self = super(MyRequestHandler, self) # try to access

> MyWebServer instance
>> self.send_response(200)
>> self.send_header('Content-type', 'text/html')
>> self.end_headers()
>> self.wfile.write("thanks for trying, but I'd like to get at

> self.foo and self.bar")
>> return
>>
>> class MyWebServer(object):
>> def __init__(self):
>> self.foo = "foo" # these are what I want to access from inside

> do_GET
>> self.bar = "bar"
>> self.httpd = HTTPServer(('127.0.0.1', 8000), MyRequestHandler)
>> sa = self.httpd.socket.getsockname()
>> print "Serving HTTP on", sa[0], "port", sa[1], "..."
>>
>> def runIt(self):
>> self.httpd.serve_forever()
>>
>> server = MyWebServer()
>> server.runIt()
>>
>> </code>
>>
>> I want to access the foo and bar variables from do_GET, but I can't

> figure out how. I suppose this is something to do with new-style vs.
> old-style classes, but I lost for a solution.
>
> Consider inheriting HTTPServer in MyWebServer which is passed to the
> request handler.
>


That was the next thing I was going to try, thanks.

>> --
>> http://mail.python.org/mailman/listinfo/python-list

>


 
Reply With Quote
 
Tom P
Guest
Posts: n/a
 
      04-05-2013
On 04/05/2013 01:54 PM, Dave Angel wrote:
> On 04/05/2013 07:02 AM, Tom P wrote:
>> First, here's a sample test program:
>> <code>
>> import sys
>> from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
>>
>> class MyRequestHandler(BaseHTTPRequestHandler, object):
>> def do_GET(self):
>> top_self = super(MyRequestHandler, self) # try to access
>> MyWebServer instance
>> self.send_response(200)
>> self.send_header('Content-type', 'text/html')
>> self.end_headers()
>> self.wfile.write("thanks for trying, but I'd like to get at
>> self.foo and self.bar")
>> return
>>
>> class MyWebServer(object):
>> def __init__(self):
>> self.foo = "foo" # these are what I want to access from inside
>> do_GET
>> self.bar = "bar"
>> self.httpd = HTTPServer(('127.0.0.1', 8000), MyRequestHandler)
>> sa = self.httpd.socket.getsockname()
>> print "Serving HTTP on", sa[0], "port", sa[1], "..."
>>
>> def runIt(self):
>> self.httpd.serve_forever()
>>
>> server = MyWebServer()
>> server.runIt()
>>
>> </code>
>>
>> I want to access the foo and bar variables from do_GET, but I can't
>> figure out how. I suppose this is something to do with new-style vs.
>> old-style classes, but I lost for a solution.

>
> It'd have been good to tell us that this was on Python 2.7
>

Yes, sorry for the omission.

> Is MyWebServer class intended to have exactly one instance?

Yes, but I was trying to keep it general.
If so, you
> could save the instance as a class attribute, and trivially access it
> from outside the class.
>
> If it might have more than one instance, then we'd need to know more
> about the class BaseHTTPServer.HTTPServer, From a quick glance at the
> docs, it looks like you get an attribute called server. So inside the
> do_GET() method, you should be able to access self.server.foo and
> self.server.bar


ok, let me test that. Do I assume correctly from what you write that
the super() is not needed?
In reality there is just one instance of MyWebServer, but I was
looking for a general solution.
>
> See http://docs.python.org/2/library/basehttpserver.html
>


 
Reply With Quote
 
Tom P
Guest
Posts: n/a
 
      04-05-2013
On 04/05/2013 01:54 PM, Dave Angel wrote:
> On 04/05/2013 07:02 AM, Tom P wrote:
>> First, here's a sample test program:
>> <code>
>> import sys
>> from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
>>
>> class MyRequestHandler(BaseHTTPRequestHandler, object):
>> def do_GET(self):
>> top_self = super(MyRequestHandler, self) # try to access
>> MyWebServer instance
>> self.send_response(200)
>> self.send_header('Content-type', 'text/html')
>> self.end_headers()
>> self.wfile.write("thanks for trying, but I'd like to get at
>> self.foo and self.bar")
>> return
>>
>> class MyWebServer(object):
>> def __init__(self):
>> self.foo = "foo" # these are what I want to access from inside
>> do_GET
>> self.bar = "bar"
>> self.httpd = HTTPServer(('127.0.0.1', 8000), MyRequestHandler)
>> sa = self.httpd.socket.getsockname()
>> print "Serving HTTP on", sa[0], "port", sa[1], "..."
>>
>> def runIt(self):
>> self.httpd.serve_forever()
>>
>> server = MyWebServer()
>> server.runIt()
>>
>> </code>
>>
>> I want to access the foo and bar variables from do_GET, but I can't
>> figure out how. I suppose this is something to do with new-style vs.
>> old-style classes, but I lost for a solution.

>
> It'd have been good to tell us that this was on Python 2.7
>
> Is MyWebServer class intended to have exactly one instance? If so, you
> could save the instance as a class attribute, and trivially access it
> from outside the class.
>
> If it might have more than one instance, then we'd need to know more
> about the class BaseHTTPServer.HTTPServer, From a quick glance at the
> docs, it looks like you get an attribute called server. So inside the
> do_GET() method, you should be able to access self.server.foo and
> self.server.bar
>
> See http://docs.python.org/2/library/basehttpserver.html
>

That doesn't work. Maybe you mean something that I'm missing?
Setting a breakpoint in do_GET:
Pdb) b 7
Breakpoint 1 at /home/tom/Desktop/tidy/Python/webserver/simpleWebserver.py:7
(Pdb) c
Serving HTTP on 127.0.0.1 port 8000 ...
> /home/tom/Desktop/tidy/Python/webserver/simpleWebserver.py(7)do_GET()

-> self.send_response(200)
(Pdb) self
<__main__.MyRequestHandler instance at 0x7ff20dde3bd8>
(Pdb) self.server
<BaseHTTPServer.HTTPServer instance at 0x7ff20dde3830>
(Pdb) dir(self.server)
['RequestHandlerClass', '_BaseServer__is_shut_down',
'_BaseServer__shutdown_request', '__doc__', '__init__', '__module__',
'_handle_request_noblock', 'address_family', 'allow_reuse_address',
'close_request', 'fileno', 'finish_request', 'get_request',
'handle_error', 'handle_request', 'handle_timeout', 'process_request',
'request_queue_size', 'serve_forever', 'server_activate',
'server_address', 'server_bind', 'server_close', 'server_name',
'server_port', 'shutdown', 'shutdown_request', 'socket', 'socket_type',
'timeout', 'verify_request']
(Pdb) self.server.foo
*** AttributeError: HTTPServer instance has no attribute 'foo'

 
Reply With Quote
 
Tom P
Guest
Posts: n/a
 
      04-06-2013
On 04/05/2013 02:27 PM, Dylan Evans wrote:
> On 05/04/2013 9:09 PM, "Tom P" <(E-Mail Removed)> wrote:
>>
>> First, here's a sample test program:
>> <code>
>> import sys
>> from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
>>
>> class MyRequestHandler(BaseHTTPRequestHandler, object):
>> def do_GET(self):
>> top_self = super(MyRequestHandler, self) # try to access

> MyWebServer instance
>> self.send_response(200)
>> self.send_header('Content-type', 'text/html')
>> self.end_headers()
>> self.wfile.write("thanks for trying, but I'd like to get at

> self.foo and self.bar")
>> return
>>
>> class MyWebServer(object):
>> def __init__(self):
>> self.foo = "foo" # these are what I want to access from inside

> do_GET
>> self.bar = "bar"
>> self.httpd = HTTPServer(('127.0.0.1', 8000), MyRequestHandler)
>> sa = self.httpd.socket.getsockname()
>> print "Serving HTTP on", sa[0], "port", sa[1], "..."
>>
>> def runIt(self):
>> self.httpd.serve_forever()
>>
>> server = MyWebServer()
>> server.runIt()
>>
>> </code>
>>
>> I want to access the foo and bar variables from do_GET, but I can't

> figure out how. I suppose this is something to do with new-style vs.
> old-style classes, but I lost for a solution.
>
> Consider inheriting HTTPServer in MyWebServer which is passed to the
> request handler.
>
>> --
>> http://mail.python.org/mailman/listinfo/python-list

>


I keep getting the same problem - if inherit from any of these classes
in BaseHTTPServer and try to use super(class, self) to initiate the
higher class, I get the error "TypeError: must be type, not classobj" -
in other words, these are old-style classes.
That means that in this call -
self.httpd = MyHTTPServer(('127.0.0.1', 8000), MyRequestHandler)

there doesn't seem to be a way to define a
class MyHTTPServer(HTTPServer)





 
Reply With Quote
 
Tom P
Guest
Posts: n/a
 
      04-06-2013
On 04/05/2013 01:02 PM, Tom P wrote:

ok, after much experimenting it looks like the solution is as follows:

class MyWebServer(object):
def __init__(self):
# self.foo = "foo" delete these from self
# self.bar = "bar"
myServer = HTTPServer
myServer.foo = "foo" #define foo,bar here
myServer.bar = "bar"

self.httpd = myServer(('127.0.0.1', 8000), MyRequestHandler)

Then, in the request handler:
class MyRequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
ss=self.server
print ss.foo


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: How include a large array? Edward A. Falk C Programming 1 04-04-2013 08:07 PM
Put variables into member variables or function variables? tjumail@gmail.com C++ 9 03-23-2008 04:03 PM
how to access higher char array element? mwebel@freenet.de C Programming 5 09-12-2006 05:38 PM
Accessing higher security level from higher security level nderose@gmail.com Cisco 0 07-11-2005 10:20 PM
Hoping somebody with higher access then guest to Cisco's web site will help me on an altruistic endeavour BikeZilla Cisco 6 08-18-2004 12:17 AM



Advertisments