posted on: 2008-06-12 14:24:07
I use some python cgi's and I use PHP for templating quite a bit. This is a way to make them communicate together.

>I use some python cgi's and I use PHP for templating quite a bit. This is a way to make them communicate together. The main trick here is to set your path.

PHP files are run from a sub directory of my site, while my cgi files are run from the cgi-bin directory. If you just set cookies, without stating the path they will be set to the path that the file is being run from.

<?PHP
setcookie("free","bird",0,"/");
?>

Thats it make sure it is early/first, because it modifies the response headers.

Python is similar but it takes a little more setup, since python is not designed to support cookies.

import cgi,Cookie

cooked = Cookie.SimpleCookie()
cooked['free']='bird'
cooked['free']['path']='/'

print cooked

Both of these programs will print out response headers to set a cookie with variable name free and value bird. The both specifiy the root path so they refer to the same cookie.

Something I found a little bit cryptic, a python Cookie when you set a value it has the following keys.

['comment', 'domain', 'secure', 'expires', 'max-age', 'version', 'path']

Those keys are how you change the various parameters. When you these parameters you need to follow the correct formatPERSISTENT CLIENT STATE

HTTP COOKIES

If you want to change the mode to secure:

cooked['free']['secure']=True

And that will append "secure" to your comment.

I found some good information http://doc.astro-wise.org/Cookie.html

I wil conclude this with two programs that play 'cookieball' with eachother. I assume this would be something similar to how you want python and php to share cookies. You can try it at

CookieBall

As in they pass a cookie back and forth like a ball.

<?PHP
if($_POST['username']){
	setcookie('username',$_POST['username'],0,'/');
	setcookie('password',$_POST['password'],0,'/');
}
echo "<h2>Your old username: ".$_COOKIE['username']."</h2>";
echo "<h2>Your old password: ".$_COOKIE['password']."</h2>";
echo "<h3>Your new username and password will become</h3>";
echo "<h2>new username: ".$_POST['username']."</h2>";
echo "<h2>new password: ".$_POST['password']."</h2>";
?>
<html>
</body>
<form method="post" action = "/cgi-bin/cookieball.cgi" name='myform'>
change username: <input name='username'/><br/>
change password: <input name='password'/><br/>
then we we'll set a cookie and everybody is happy.<br/>
<input type='submit'/>
</form>
</body>
</html>

And the corresponding python program.

#!/usr/bin/env python
"""
Passing cookies between a .cgi and php program
"""
import cgi,Cookie
import os

cookme = Cookie.SimpleCookie()
cookme.load(os.environ.get('HTTP_COOKIE',''))
print os.environ

FormData = cgi.FieldStorage()
entered_name=FormData.getvalue('username')
test = 0

#to set a cookie this has to be your first output.
if FormData.has_key('password') and FormData.has_key('username'):
	cooked = Cookie.SimpleCookie()
	cooked['username']=FormData.getvalue('username')
	cooked['username']['path']='/'
	cooked['password']=FormData.getvalue('password')
	cooked['password']['path']='/'
	test = 1
	print cooked

#And this line is very nescessary.
print "Content-Type: text/html\n\n"
print "<h3>lets get you authenticated so we can proceed?</h3>"

if cookme.has_key('username') and cookme.has_key('password'):
	print "<h2>Current username:"
	print cookme.get('username').value
	print "</h2>"
	print "<h2>current password:"
	print cookme.get('password').value
	print "</h2>"
else:
	print "<h3>no username/password as of yet.</h3>"

if test==1:
	print "<h3>your cookies have been changed just now.</h3><br/>"
	print "<h2>new username = "
	print FormData.getvalue('username')
	print "</h2><h2>new password = "
	print FormData.getvalue('password')
	print "</h2><br/>"
else:
	print "no username/password were specified so it is not being changed"

print "<form method=\"post\" action = \"/cookieball/index.php\" name='myform'>"
print "username: <input name='username'/><br/>"
print "password: <input name='password'/><br/>"
print "then we we'll set a cookie and everybody is happy.<br/>"
print "<input type='submit'/>"
print "</form>"

In closing there are some subtle differences in the way the cookies are set. Python uses quotes and PHP changes spaces to +'s so So preparcing my need to take place to make sure they get change accordingly.

Comments

Name: