Communicating with a PHP script (and pretending I'm a browser)

Marc Aymerich glicerinu at gmail.com
Tue Nov 11 18:31:01 CET 2014


On Tue, Nov 11, 2014 at 6:26 PM, Larry Martell <larry.martell at gmail.com> wrote:
> On Tue, Nov 11, 2014 at 12:18 PM, Marc Aymerich <glicerinu at gmail.com> wrote:
>> On Tue, Nov 11, 2014 at 5:43 PM, Larry Martell <larry.martell at gmail.com> wrote:
>>> On Tue, Nov 11, 2014 at 11:00 AM, Marc Aymerich <glicerinu at gmail.com> wrote:
>>>> On Tue, Nov 11, 2014 at 4:48 PM, Larry Martell <larry.martell at gmail.com> wrote:
>>>>>
>>>>> I have a PHP app that I want to convert to django. But I want to do it
>>>>> stages. All the heavy lifting is in the PHP code, so first, I want to
>>>>> just use templates and views to generate the HTML, but still call the
>>>>> PHP code. Then later convert the PHP to python.
>>>>>
>>>>> My issue is that the PHP code expects to get all it's input from the
>>>>> REQUEST object and I've consumed that in the view. Is there any way I
>>>>> can somehow supply that to the PHP code?
>>>>>
>>>>> Is there some way python can communicate like curl ... it needs to
>>>>> send the request string in the body of a POST request to the URL that
>>>>> will route to the PHP script and get the output back.
>>>>
>>>>
>>>> Yes,
>>>> I supose you can extract the needed information from the django
>>>> Request object and call the php script passing the needed variables as
>>>> environment state.
>>>>
>>>> as a guideline you can do something like
>>>>
>>>> cmd = (
>>>>     'REDIRECT_STATUS=200 '
>>>>     'REQUEST_METHOD=GET '
>>>>     'SCRIPT_FILENAME=htdocs/index.php '
>>>>     'SCRIPT_NAME=/index.php '
>>>>     'PATH_INFO=/ '
>>>>     'SERVER_NAME=site.tld '
>>>>     'SERVER_PROTOCOL=HTTP/1.1 '
>>>>     'REQUEST_URI=/nl/page '
>>>>     'HTTP_HOST=site.tld '
>>>>     '/usr/bin/php-cgi'
>>>> )
>>>> subprocess.Popen(cmd, stdout=subprocess.PIPE)
>>>
>>> Thanks very much Marc. In the example, how is the request string passed in?
>>
>>
>> Yeah, a more complete example would be
>>
>> cmd = (
>>     'REDIRECT_STATUS={status} '
>>     'REQUEST_METHOD={method} '
>>     'SCRIPT_FILENAME={file} '
>>     'SCRIPT_NAME=/index.php '
>>     'PATH_INFO={path} '
>>     'SERVER_NAME=site.tld '
>>     'SERVER_PROTOCOL=HTTP/1.1 '
>>     'REQUEST_URI={path} '
>>     'HTTP_HOST=site.tld '
>>     '/usr/bin/php-cgi'
>> ).format(
>>     status=request.status,
>>     method=request.method,
>>     path=request.path,
>>     file=my_php_path_mapper(request.path),
>> )
>>
>> php = subprocess.Popen(cmd, stdout=subprocess.PIPE)
>> response, err = php.communicate()
>> if php.return_code != 0:
>>     return ResponseError(content=err)
>> return Response(content=response)
>>
>>
>> still incomplete and mostly wrong, but good enough to illustrate the
>> main pattern :)
>
>
> So I would put the contents of what I want in the request object in
> the file request.path?

I just invented the attribute names that django actually uses, but you
can look at the excellent django documentation for the correct ones

https://docs.djangoproject.com/en/dev/ref/request-response/

still this is a toy example and probably it would be a pain in the ass
to really map the mixed URLs between the two web applications.

-- 
Marc



More information about the Python-list mailing list