[Pythonmac-SIG] PyObjC and Criollo HTTP server

Rand Dvorak randdvorak at gmail.com
Thu Jan 9 11:55:49 EST 2020


Yep, that’s it.  Just for posterity here’s the successful proof of concept.

import objc 
from Foundation import NSLog, NSRunLoop

CRApplication = objc.lookUpClass("CRApplication")
objc.registerMetaDataForSelector(
	b'CRRouter',
	b'get:block:',
	{
	'arguments': {
		3: { 'callable': {
			'arguments': {
			0:{'type': b'^v'},
			1:{'type': b'@'},
			2:{'type': b'@'},
			3:{'type': b'@'}
			},
		'	retval': { 'type': b'v' }
			}
		   }
		}
	}
)
objc.registerMetaDataForSelector(
	b'CRRouter',
	b'add:block:',
	{
	'arguments': {
		3: { 'callable': {
			'arguments': {
			0:{'type': b'^v'},
			1:{'type': b'@'},
			2:{'type': b'@'},
			3:{'type': b'@'}
			},
		'	retval': { 'type': b'v' }
			}
		   }
		}
	}
)

global server

def helloHandler(request, response, handler):
	NSLog("%@ %@ %@", request, response, handler)
	response.send_("Hello World!")
	handler()

def completionHandler(request, response, handler):
	NSLog("Completion handler called")

if __name__ == "__main__":
	server = CRApplication.sharedApplication().delegate().server()
	NSLog("Server: %@", server)
	server.get_block_("/", helloHandler)
	server.add_block_("/", completionHandler)
	NSLog("Started...")
	listening = server.startListening()
	NSRunLoop.currentRunLoop().run()


> On Jan 9, 2020, at 04:18, Ronald Oussoren <ronaldoussoren at mac.com> wrote:
> 
> 
>> On 9 Jan 2020, at 00:23, Rand Dvorak <randdvorak at gmail.com <mailto:randdvorak at gmail.com>> wrote:
>> 
>> I got it working.  Basically I have a main.py file in Resources that get loaded and run by PyRun_SimpleFile in applicationDidFinishLaunching.  Control is then passed to the python interpreter.  Notice the infinite loop at the bottom which is needed because the interpreter finishes executing the file and exits.  It is needed to keep the python interpreter alive.  I need a better solution to keep the interpreter alive because this eats up too much cpu. It was just a hack to prove that is what was happening.
> 
> I’ve quickly scanned https://github.com/thecatalinstan/Criollo/wiki/Getting-Started <https://github.com/thecatalinstan/Criollo/wiki/Getting-Started> and that seems to indicate that the webserver integrates with the regular Cocoa event loop. That means you’ll probably need to run the NSRunloop or CFRunloop.
> 
> Ronald
>> 
> Twitter: @ronaldoussoren
> Blog: https://blog.ronaldoussoren.net/ <https://blog.ronaldoussoren.net/>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/pythonmac-sig/attachments/20200109/80232549/attachment-0001.html>


More information about the Pythonmac-SIG mailing list