我在部署 Django 应用程序后无法登录,但在使用内置开发服务器时可以。我会在下面列出错误和我使用的内容。我已经迁移到 live sql server 没有错误。我创建了一个没有错误的超级用户。对 django 文件唯一真正的改变是设置了不应该影响数据库的静态文件(我假设这个错误来自哪里)。这是错误:
<块引用>“NoneType”类型的 /login/ 参数中的 TypeError 不可迭代
请求方式:POST 请求地址:http://sitename/login/
Django
版本:3.0 异常类型:TypeError 异常值:参数
类型 'NoneType' 不可迭代
异常
位置:c:\python39\lib\site-packages\sql_server\pyodbc\base.py中
encode_value,第 59 行
Python 可执行文件:c:\python39\python.exe Python
版本:3.9.4
现在关于环境中运行的内容及其部署方式的一些核心说明:
部署在windows IIS上
在 django_mssql_backend-2.8.1 中使用 mssql(我验证了所有软件包都在同一版本上。我认为唯一的区别是开发中的 3.9.1 与生产中的 3.9.4 上的 python)
Django 3.0
SQL Server 是 2019 年的开发版与 2017 年的生产版。不确定这是否会改变任何东西,或者我因此需要更改任何设置,但初始迁移命令和创建用户命令有效。
pyodbc-4.0.30
wfastcgi-3.0.0(仅限产品)
使用 django.contrib.auth(身份验证、登录、注销)进行身份验证。再次,所有工作在开发环境中。
有没有人知道为什么这在生产环境中与在开发环境中运行时的功能不同?事实上,它在运行 manage.py runserver 时运行良好(可以登录/退出),但在通过 IIS 访问时却没有。
编辑:登录视图在下面,主要是按照 youtube 教程和下面的完整错误回溯完成的:
def loginpage(request):
if request.user.is_authenticated:
return redirect('alfred-home')
else:
if request.method== 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return redirect('alfred-home')
else:
messages.info(request, 'Username or password is incorrect')
context = {}
return render(request, 'authentication/login.html', context)
错误信息:
Environment:
Request Method: POST
Request URL: http://lsdmalfred/login/?next=/
Django Version: 3.0
Python Version: 3.9.4
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'home.apps.HomeConfig',
'authentication.apps.AuthenticationConfig',
'automation.apps.AutomationConfig']
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.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback (most recent call last):
File "c:\python39\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
File "c:\python39\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "c:\python39\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\inetpub\alfred\alfred\authentication\views.py", line 30, in loginpage
user = authenticate(request, username=username, password=password)
File "c:\python39\lib\site-packages\django\contrib\auth\__init__.py", line 72, in authenticate
user = backend.authenticate(request, **credentials)
File "c:\python39\lib\site-packages\django\contrib\auth\backends.py", line 46, in authenticate
user = UserModel._default_manager.get_by_natural_key(username)
File "c:\python39\lib\site-packages\django\contrib\auth\base_user.py", line 44, in get_by_natural_key
return self.get(**{self.model.USERNAME_FIELD: username})
File "c:\python39\lib\site-packages\django\db\models\manager.py", line 82, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "c:\python39\lib\site-packages\django\db\models\query.py", line 411, in get
num = len(clone)
File "c:\python39\lib\site-packages\django\db\models\query.py", line 258, in __len__
self._fetch_all()
File "c:\python39\lib\site-packages\django\db\models\query.py", line 1261, in _fetch_all
self._result_cache = list(self._iterable_class(self))
File "c:\python39\lib\site-packages\django\db\models\query.py", line 57, in __iter__
results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
File "c:\python39\lib\site-packages\django\db\models\sql\compiler.py", line 1124, in execute_sql
sql, params = self.as_sql()
File "c:\python39\lib\site-packages\sql_server\pyodbc\compiler.py", line 177, in as_sql
supports_offset_clause = self.connection.sql_server_version >= 2012
File "c:\python39\lib\site-packages\django\utils\functional.py", line 48, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "c:\python39\lib\site-packages\sql_server\pyodbc\base.py", line 400, in sql_server_version
with self.temporary_connection() as cursor:
File "c:\python39\lib\contextlib.py", line 117, in __enter__
return next(self.gen)
File "c:\python39\lib\site-packages\django\db\backends\base\base.py", line 604, in temporary_connection
with self.cursor() as cursor:
File "c:\python39\lib\site-packages\django\utils\asyncio.py", line 24, in inner
return func(*args, **kwargs)
File "c:\python39\lib\site-packages\django\db\backends\base\base.py", line 260, in cursor
return self._cursor()
File "c:\python39\lib\site-packages\sql_server\pyodbc\base.py", line 218, in _cursor
conn = super()._cursor()
File "c:\python39\lib\site-packages\django\db\backends\base\base.py", line 236, in _cursor
self.ensure_connection()
File "c:\python39\lib\site-packages\django\utils\asyncio.py", line 24, in inner
return func(*args, **kwargs)
File "c:\python39\lib\site-packages\django\db\backends\base\base.py", line 220, in ensure_connection
self.connect()
File "c:\python39\lib\site-packages\django\utils\asyncio.py", line 24, in inner
return func(*args, **kwargs)
File "c:\python39\lib\site-packages\django\db\backends\base\base.py", line 197, in connect
self.connection = self.get_new_connection(conn_params)
File "c:\python39\lib\site-packages\sql_server\pyodbc\base.py", line 293, in get_new_connection
connstr = encode_connection_string(cstr_parts)
File "c:\python39\lib\site-packages\sql_server\pyodbc\base.py", line 49, in encode_connection_string
return ';'.join(
File "c:\python39\lib\site-packages\sql_server\pyodbc\base.py", line 50, in <genexpr>
'%s=%s' % (k, encode_value(v))
File "c:\python39\lib\site-packages\sql_server\pyodbc\base.py", line 59, in encode_value
if ';' in v or v.strip(' ').startswith('{'):
Exception Type: TypeError at /login/
Exception Value: argument of type 'NoneType' is not iterable
数据库设置:
DATABASES = {
'default': {
'ENGINE': 'sql_server.pyodbc',
'NAME': 'removeddbname',
'USER': 'removedusername',
'PASSWORD': removedpassword,
'OPTIONS': {
'driver': 'ODBC Driver 17 for SQL Server',
},
},
}