Here’s my views.py:
from django.shortcuts import render_to_response
from django.template import RequestContext
import subprocess
globalsource=0
def upload_file(request):
'''This function produces the form which allows user to input session_name, their remote host name, username
and password of the server. User can either save, load or cancel the form. Load will execute couple Linux commands
that will list the files in their remote host and server.'''
if request.method == 'POST':
# session_name = request.POST['session']
url = request.POST['hostname']
username = request.POST['username']
password = request.POST['password']
globalsource = str(username) + "@" + str(url)
command = subprocess.Popen(['rsync', '--list-only', globalsource],
stdout=subprocess.PIPE,
env={'RSYNC_PASSWORD': password}).communicate()[0]
result1 = subprocess.Popen(['ls', '/home/'], stdout=subprocess.PIPE).communicate()[0]
result = ''.join(result1)
return render_to_response('thanks.html', {'res':result, 'res1':command}, context_instance=RequestContext(request))
else:
pass
return render_to_response('form.html', {'form': 'form'}, context_instance=RequestContext(request))
##export PATH=$RSYNC_PASSWORD:/usr/bin/rsync
def sync(request):
"""Sync the files into the server with the progress bar"""
finalresult = subprocess.Popen(['rsync', '-zvr', '--progress', globalsource, '/home/zurelsoft/R'], stdout=subprocess.PIPE).communicate()[0]
return render_to_response('synced.html', {'sync':finalresult}, context_instance=RequestContext(request))
The problem is in sync() view. The global variable value from upload_file is not taken but the globalvariable=0 is taken in sync view. What am I doing wrong?
Edit:
Tried doing like this:
global globalsource = str(username) + "@" + str(url)
However, I get this error:
SyntaxError at /upload_file/
invalid syntax (views.py, line 17)
Request Method: GET
Request URL: http://127.0.0.1:8000/upload_file/
Django Version: 1.4.1
Exception Type: SyntaxError
Exception Value:
invalid syntax (views.py, line 17)
If you assign to a variable anywhere in a function, Python treats that variable as local. So in
upload_fileyou are not getting at the globalglobalsource, but are creating a new local one that gets thrown away at the end of the function.To make Python use a global variable even when you are assigning to it, put a
global globalsourcestatement in yourupload_filefunction.Edit: That’s not how you use the
globalstatement. You need to do this in your function: