Django:如何在视图下从一个函数获取输入到另一个函数?
Django: how to get input from one function to another function under views?
我是 django 的菜鸟,我知道我的问题很基础。我想设计一个具有两个功能的 Web 应用程序。第一个功能可以让用户在首页输入一个wav音频文件名。第二个函数可以读取这个音频文件并分析音频信号并制作 fft 图。如果我单独 运行,我的每个函数都可以正常工作,我只是不知道如何让我的第二个函数读取从第一个函数获得的文件名。
这是我输入文件名的第一个函数。
def home(request):
form = EmailForm(request.POST or None)
if form.is_valid():
print form.cleaned_data['filename']
context = {"form": form}
template = "home.html"
return render(request, template, context)
这是我的第二个功能的一部分:
def fftsound(request):
from scipy import fft, arange, ifft
from scipy.io import wavfile
form = EmailForm(request.POST or None)
if request.method == 'POST':
print "POST"
if form.is_valid():
print "valid"
filename = form.cleaned_data.get('filename')
else:
form = EmailForm()
rate,data=wavfile.read(filename)
我的表单如下所示:
class EmailForm(forms.Form):
filename = forms.CharField(max_length=100, required=True)
我的模型是这样的:
class application(models.Model):
filename= models.CharField(max_length=100, blank=False, null=False)
def __unicode__(self):
return "%s" %(self.filename)
现在如果我只 运行 我的第一个功能,我可以在我的终端上得到正确的打印。我只是不知道如何将此输入应用于我的第二个功能。谁能帮我这个?非常感谢!
在你的第一个函数中
return fftsound(request, filename)
在你的第二个函数中,
def fftsound(request, filename):
将最后一行改为
return render(request, template, context)
我建议您使用类似这样的主视图:
def home(request):
if request.method == 'POST':
form = EmailForm(request.POST)
if form.is_valid():
app = application.objects.create(filename=form.cleaned_data['filename'])
return HttpResponseRedirect('/fft/{}/'.format(app.id))
form = EmailForm()
return render(request, 'home.html', {'form': form})
这会将文件名保存到数据库中,以便您稍后阅读,并将用户重定向到下一个 url(每个文件都是唯一的 - /fft/<file_id>
)。
您还必须将实际文件保存到数据库吗?或者更好:将其保存到磁盘并在数据库中引用它。阅读 THIS 了解更多信息。
下一步是将条目添加到您的 urls.py
文件以处理这个新的 url。它看起来像:
url(r'^fft/(?P<file_id>[0-9]+)/$', views.fftsound),
有了这个,你将给 fftsound
函数额外的参数 (file_id
)。所以你得稍微修改一下。
def fftsound(request, file_id):
app = application.objects.get(id=file_id)
...
你将在 app.filename
中有文件名,在 app.fftfile
中有文件名(或类似的东西——正如我提到的,你必须添加这部分)。你可以随心所欲地使用它们。
使用此方法,您可以随时返回并查看已上传文件的 fft 图(只需转到 /fft/42/
)。因此,如果不希望所有文件都是 public.
,则必须添加某种访问控制
我是 django 的菜鸟,我知道我的问题很基础。我想设计一个具有两个功能的 Web 应用程序。第一个功能可以让用户在首页输入一个wav音频文件名。第二个函数可以读取这个音频文件并分析音频信号并制作 fft 图。如果我单独 运行,我的每个函数都可以正常工作,我只是不知道如何让我的第二个函数读取从第一个函数获得的文件名。
这是我输入文件名的第一个函数。
def home(request):
form = EmailForm(request.POST or None)
if form.is_valid():
print form.cleaned_data['filename']
context = {"form": form}
template = "home.html"
return render(request, template, context)
这是我的第二个功能的一部分:
def fftsound(request):
from scipy import fft, arange, ifft
from scipy.io import wavfile
form = EmailForm(request.POST or None)
if request.method == 'POST':
print "POST"
if form.is_valid():
print "valid"
filename = form.cleaned_data.get('filename')
else:
form = EmailForm()
rate,data=wavfile.read(filename)
我的表单如下所示:
class EmailForm(forms.Form):
filename = forms.CharField(max_length=100, required=True)
我的模型是这样的:
class application(models.Model):
filename= models.CharField(max_length=100, blank=False, null=False)
def __unicode__(self):
return "%s" %(self.filename)
现在如果我只 运行 我的第一个功能,我可以在我的终端上得到正确的打印。我只是不知道如何将此输入应用于我的第二个功能。谁能帮我这个?非常感谢!
在你的第一个函数中
return fftsound(request, filename)
在你的第二个函数中,
def fftsound(request, filename):
将最后一行改为
return render(request, template, context)
我建议您使用类似这样的主视图:
def home(request):
if request.method == 'POST':
form = EmailForm(request.POST)
if form.is_valid():
app = application.objects.create(filename=form.cleaned_data['filename'])
return HttpResponseRedirect('/fft/{}/'.format(app.id))
form = EmailForm()
return render(request, 'home.html', {'form': form})
这会将文件名保存到数据库中,以便您稍后阅读,并将用户重定向到下一个 url(每个文件都是唯一的 - /fft/<file_id>
)。
您还必须将实际文件保存到数据库吗?或者更好:将其保存到磁盘并在数据库中引用它。阅读 THIS 了解更多信息。
下一步是将条目添加到您的 urls.py
文件以处理这个新的 url。它看起来像:
url(r'^fft/(?P<file_id>[0-9]+)/$', views.fftsound),
有了这个,你将给 fftsound
函数额外的参数 (file_id
)。所以你得稍微修改一下。
def fftsound(request, file_id):
app = application.objects.get(id=file_id)
...
你将在 app.filename
中有文件名,在 app.fftfile
中有文件名(或类似的东西——正如我提到的,你必须添加这部分)。你可以随心所欲地使用它们。
使用此方法,您可以随时返回并查看已上传文件的 fft 图(只需转到 /fft/42/
)。因此,如果不希望所有文件都是 public.