我是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)
现在如果我只运行我的第一个功能,我可以在终端上获得正确的打印。我只是不知道如何在我的第二个函数上应用这个输入。谁能帮我这个?非常感谢你!
答案 0 :(得分:0)
在你的第一个函数中
return fftsound(request, filename)
在你的第二个功能中,
def fftsound(request, filename):
将最后一行更改为
return render(request, template, context)
答案 1 :(得分:0)
我建议您在家庭视图中使用类似的内容:
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})
这会将文件名保存到数据库,因此您可以稍后阅读,并将用户重定向到下一个网址(这对每个文件都是唯一的 - /fft/<file_id>
)。
您还必须将实际文件保存到数据库中吗?或者更好:将其保存到磁盘并在数据库中引用它。阅读THIS了解mor信息。
下一步是在urls.py
文件中添加条目以处理这个新网址。它看起来像:
url(r'^fft/(?P<file_id>[0-9]+)/$', views.fftsound),
使用此功能,您将为file_id
功能提供额外参数(fftsound
)。所以你必须稍微修改一下。
def fftsound(request, file_id):
app = application.objects.get(id=file_id)
...
你将在app.filename
中有文件名,并在app.fftfile
中提交文件(或者类似的东西 - 正如我所提到的,你必须添加这部分)。无论你想要什么,你都可以随心所欲。
使用此方法,您可以随时返回并查看已上传文件的fft图(只需转到让我们说/fft/42/
)。因此,如果不希望所有文件都是公共文件,则必须添加某种访问控制。