如何在我的 python 脚本和我的 Django 视图(导入、请求)之间进行交互?
How to Interact between my python script and my Django view (import, request)?
我尽我所能解释我的问题:
我有一个用 3 个模块编写的程序。我想从站点(现在我正在使用本地主机进行测试)保存一些数据到一些变量,并以这种方式在索引页面中显示一些变量的值:
1.- [Script: Text_Variable] <-- [localhost: ask_for_text]
2.- [Script: Menu_Options] --> [localhost: show_menu]
3.- [Script: Option_Variable] <-- [localhost: user_option]
4.- [Script: Response_Variable] --> [localhost: show_response]
根据 "Text_Variable" 的值,程序执行:1 --> 4 或 1 --> 2 --> 3 --> 4
我可以从 "views.py" 中的脚本导入而不会出现问题,函数和变量使过程 1 --> 4 正常工作,但函数 "Menu_Options" 有问题:
我使用 "POST" 方法从页面获取数据,所以我需要将参数 "request" 传递给我在 "views.py" 中的函数,但我从脚本中调用了这个函数,所以我需要在模块中导入 "request"。我试过这些:
import newproject.views
import django
from django.http import request
script_module.py:
...
Pregunta = 'question?'
Opciones = [op1, op2...]
opc = boletin.views.Menu_Opciones(request, Pregunta, Opciones)
...
views.py:
...
def Menu_Opciones(request, Pregunta, Opciones):
request.session['ops'] = Opciones
request.session['preg'] = Pregunta
Menu_Opc(request)
opcion = request.session['op']
return opcion
...
...
def Menu_Opc(request):
Opciones = request.session['ops']
Pregunta = request.session['preg']
form = OpcionesForm(request.POST or None)
form.Campo_Opciones.widget.choices = Opciones
context = {
'pregunta': Pregunta,
'form': form,
}
if form.is_valid():
opcion = form.instance.ops.value() + 1
request.session['op'] = opcion
return render(request, "inicio.html", context)
...
但是我有这个错误:"Menu_Opciones() missing 1 required positional argument: 'Opciones'"
这是回溯:
Environment:
Request Method: POST
Request URL: http://127.0.0.1:8000/
Django Version: 1.9.8
Python Version: 3.4.2
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'boletin',
'proyectoapp']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback:
File "C:\Users\ATI\Desktop\probardjango\lib\site-packages\django\core\handlers\base.py" in get_response
149. response = self.process_exception_by_middleware(e, request)
File "C:\Users\ATI\Desktop\probardjango\lib\site-packages\django\core\handlers\base.py" in get_response
147. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\ATI\Desktop\probardjango\src\boletin\views.py" in inicio
42. salida = main(pregunta)
File "C:\Users\ATI\Proyecto\ESI\Main.py" in main
52. Respuesta = construir_respuesta(pregunta_lista, 'Profesores', CSin, TMaxCoin)
File "C:\Users\ATI\Proyecto\ESI\Entrada_Salida.py" in construir_respuesta
127. opc = boletin.views.Menu_Opciones(Pregunta, Opciones)
Exception Type: TypeError at /
Exception Value: Menu_Opciones() missing 1 required positional argument: 'Opciones'
我这样做是不是做错了,或者有更好的方法吗?
请考虑我是这种语言的新手。
提前致谢。
编辑:
我解决了一个问题!我告诉你怎么做:
首先我将 python 模块的路径添加到 setting.py,然后我决定复制所有脚本模块并粘贴到我的 django 项目中但忘记更改路径...然后,每次我编辑了我的模块,我真的编辑了错误的文件...这就是为什么回溯似乎没有意义。
但现在我收到一个新错误:
"'module' 对象没有属性 'session'"
Environment:
Request Method: POST
Request URL: http://127.0.0.1:8000/
Django Version: 1.9.8
Python Version: 3.4.2
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'boletin',
'proyectoapp']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback:
File "C:\Users\ATI\Desktop\probardjango\lib\site- packages\django\core\handlers\base.py" in get_response
149. response = self.process_exception_by_middleware(e, request)
File "C:\Users\ATI\Desktop\probardjango\lib\site- packages\django\core\handlers\base.py" in get_response
147. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\ATI\Desktop\probardjango\src\boletin\views.py" in inicio
42. salida = main(pregunta)
File "C:\Users\ATI\Desktop\probardjango\src\boletin\Main.py" in main
52. Respuesta = construir_respuesta(pregunta_lista, 'Profesores', CSin, TMaxCoin)
File "C:\Users\ATI\Desktop\probardjango\src\boletin\Entrada_Salida.py" in construir_respuesta
127. opc = boletin.views.Menu_Opciones(request, Pregunta, Opciones)
File "C:\Users\ATI\Desktop\probardjango\src\boletin\views.py" in Menu_Opciones
137. request.session['ops'] = Opciones
Exception Type: AttributeError at /
Exception Value: 'module' object has no attribute 'session'
如果我这样更改导入代码:
from django.http import request
至:
from django.http import HttpRequest
request = HttpRequest()
我还有这个错误:
"'HttpRequest' 对象没有属性 'session'"
并且回溯完全相同但是那个错误。
不是"request"和"HttpRequest"的对象吗?
"django.http"里面不就是"HttpRequest"吗?
"HttpRequest" 的对象没有属性 'session' 吗?
我做错了什么?
从堆栈跟踪来看,文件 "C:\Users\ATI\Proyecto\ESI\Entrada_Salida.py" 的第 127 行似乎有错误。在调用 Menu_Opciones
函数
时,您没有传递 'request' 参数
我修好了!我意识到我在调用脚本主函数时忘记传递 "request" 参数。这就是为什么我的外部脚本 "didn't know" 是 "request" 的原因。
我尽我所能解释我的问题:
我有一个用 3 个模块编写的程序。我想从站点(现在我正在使用本地主机进行测试)保存一些数据到一些变量,并以这种方式在索引页面中显示一些变量的值:
1.- [Script: Text_Variable] <-- [localhost: ask_for_text]
2.- [Script: Menu_Options] --> [localhost: show_menu]
3.- [Script: Option_Variable] <-- [localhost: user_option]
4.- [Script: Response_Variable] --> [localhost: show_response]
根据 "Text_Variable" 的值,程序执行:1 --> 4 或 1 --> 2 --> 3 --> 4 我可以从 "views.py" 中的脚本导入而不会出现问题,函数和变量使过程 1 --> 4 正常工作,但函数 "Menu_Options" 有问题: 我使用 "POST" 方法从页面获取数据,所以我需要将参数 "request" 传递给我在 "views.py" 中的函数,但我从脚本中调用了这个函数,所以我需要在模块中导入 "request"。我试过这些:
import newproject.views
import django
from django.http import request
script_module.py:
...
Pregunta = 'question?'
Opciones = [op1, op2...]
opc = boletin.views.Menu_Opciones(request, Pregunta, Opciones)
...
views.py:
...
def Menu_Opciones(request, Pregunta, Opciones):
request.session['ops'] = Opciones
request.session['preg'] = Pregunta
Menu_Opc(request)
opcion = request.session['op']
return opcion
...
...
def Menu_Opc(request):
Opciones = request.session['ops']
Pregunta = request.session['preg']
form = OpcionesForm(request.POST or None)
form.Campo_Opciones.widget.choices = Opciones
context = {
'pregunta': Pregunta,
'form': form,
}
if form.is_valid():
opcion = form.instance.ops.value() + 1
request.session['op'] = opcion
return render(request, "inicio.html", context)
...
但是我有这个错误:"Menu_Opciones() missing 1 required positional argument: 'Opciones'"
这是回溯:
Environment:
Request Method: POST
Request URL: http://127.0.0.1:8000/
Django Version: 1.9.8
Python Version: 3.4.2
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'boletin',
'proyectoapp']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback:
File "C:\Users\ATI\Desktop\probardjango\lib\site-packages\django\core\handlers\base.py" in get_response
149. response = self.process_exception_by_middleware(e, request)
File "C:\Users\ATI\Desktop\probardjango\lib\site-packages\django\core\handlers\base.py" in get_response
147. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\ATI\Desktop\probardjango\src\boletin\views.py" in inicio
42. salida = main(pregunta)
File "C:\Users\ATI\Proyecto\ESI\Main.py" in main
52. Respuesta = construir_respuesta(pregunta_lista, 'Profesores', CSin, TMaxCoin)
File "C:\Users\ATI\Proyecto\ESI\Entrada_Salida.py" in construir_respuesta
127. opc = boletin.views.Menu_Opciones(Pregunta, Opciones)
Exception Type: TypeError at /
Exception Value: Menu_Opciones() missing 1 required positional argument: 'Opciones'
我这样做是不是做错了,或者有更好的方法吗? 请考虑我是这种语言的新手。 提前致谢。
编辑:
我解决了一个问题!我告诉你怎么做:
首先我将 python 模块的路径添加到 setting.py,然后我决定复制所有脚本模块并粘贴到我的 django 项目中但忘记更改路径...然后,每次我编辑了我的模块,我真的编辑了错误的文件...这就是为什么回溯似乎没有意义。
但现在我收到一个新错误:
"'module' 对象没有属性 'session'"
Environment:
Request Method: POST
Request URL: http://127.0.0.1:8000/
Django Version: 1.9.8
Python Version: 3.4.2
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'boletin',
'proyectoapp']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback:
File "C:\Users\ATI\Desktop\probardjango\lib\site- packages\django\core\handlers\base.py" in get_response
149. response = self.process_exception_by_middleware(e, request)
File "C:\Users\ATI\Desktop\probardjango\lib\site- packages\django\core\handlers\base.py" in get_response
147. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\ATI\Desktop\probardjango\src\boletin\views.py" in inicio
42. salida = main(pregunta)
File "C:\Users\ATI\Desktop\probardjango\src\boletin\Main.py" in main
52. Respuesta = construir_respuesta(pregunta_lista, 'Profesores', CSin, TMaxCoin)
File "C:\Users\ATI\Desktop\probardjango\src\boletin\Entrada_Salida.py" in construir_respuesta
127. opc = boletin.views.Menu_Opciones(request, Pregunta, Opciones)
File "C:\Users\ATI\Desktop\probardjango\src\boletin\views.py" in Menu_Opciones
137. request.session['ops'] = Opciones
Exception Type: AttributeError at /
Exception Value: 'module' object has no attribute 'session'
如果我这样更改导入代码:
from django.http import request
至:
from django.http import HttpRequest
request = HttpRequest()
我还有这个错误:
"'HttpRequest' 对象没有属性 'session'"
并且回溯完全相同但是那个错误。
不是"request"和"HttpRequest"的对象吗? "django.http"里面不就是"HttpRequest"吗? "HttpRequest" 的对象没有属性 'session' 吗? 我做错了什么?
从堆栈跟踪来看,文件 "C:\Users\ATI\Proyecto\ESI\Entrada_Salida.py" 的第 127 行似乎有错误。在调用 Menu_Opciones
函数
我修好了!我意识到我在调用脚本主函数时忘记传递 "request" 参数。这就是为什么我的外部脚本 "didn't know" 是 "request" 的原因。