使用IIS7中的Windows身份验证通过django-pyodbc验证MSSQL

时间:2016-05-25 18:15:08

标签: python sql-server django iis

我正在为我的雇主构建内部网,我决定尝试使用django服务器设置。我们使用带有MSSQL 2008的Windows服务器,其中包含大量数据。我希望将Intranet与用于身份验证的域和现有的MSSQL服务器集成。

似乎所有事情都与MSSQL服务器的连接有关。这个问题看起来很简单:它试图使用错误的凭据。我已将IIS设置为使用Windows身份验证并禁用匿名登录。当我访问该网站时,系统会提示我输入我的凭据。当页面尝试加载时,django抛出错误,但异常:

Exception Type: Error
Exception Value: ('28000', "[28000] [Microsoft][ODBC SQL Server Driver][SQL Server]Login failed for user 'DOMAIN\\DJANGO$'. (18456) (SQLDriverConnect)")
Exception Location: c:\python35\lib\site-packages\sql_server\pyodbc\base.py in get_new_connection, line 301

请注意,DJANGO是我用来测试此服务器的虚拟计算机的名称。似乎解决方案就像弄清楚如何通过django从IIS传递Windows登录凭据以进行初始MSSQL连接一样简单。

现在有一些细节,我有:

我有django settings.py条目:

...
MIDDLEWARE_CLASSES = [
  ...
  'django.contrib.auth.middleware.AuthenticationMiddleware',
  'django.contrib.auth.middleware.PersistentRemoteUserMiddelware',
  ...
]
...
WSGI_APPLICATION = 'intranet.wsgi.application' #intranet is the project name
...
DATABASES = {
  'default': {
    'ENGINE': 'sql_server.pyodbc',
    'NAME': 'DatabaseName',
    'HOST': 'Server',
    'AUTOCOMMIT': False,
  }
}
...
AUTHENTICATION_BACKENDS = [
  'django.contrib.auth.backends.RemoteUserBackend',
]
...

IIS和django之间的交互基于https://pypi.python.org/pypi/wfastcgi的教程工作,WSIG_HANDLER被Django on IIS: django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet的建议改变了(因为内部网没有名为wsgi_app()的模块而提示更改,不知道我是怎么想到尝试它的,但它起作用了,我继续前进。)

为了实现这一目标需要付出很多努力,希望这是一个简单的解决方案。我的另一个想法是放弃django sql模型系统并处理直接查询,但我宁愿在重新开发轮子之前采用“正确”的方式。

2 个答案:

答案 0 :(得分:0)

尝试使用以下对我有用的方法来尝试运行Django乐趣的人有些晚了:

DATABASES = {
'default': {
    'NAME': 'my_database',
    'ENGINE': 'sql_server.pyodbc',
    'HOST': 'dbserver',
    'PORT': 'XXXX',
    'OPTIONS': { 'DRIVER':'SQL Server Native Client 11.0', 'Extra_Params':'Trusted_Connection=True'},
}}

祝您编程愉快!

答案 1 :(得分:0)

我遇到了这个问题,并救了我this link教程

对于Django App,只需将连接更改为以下代码即可,并与Identity = Localsystem完美配合

cnxn = pyodbc.connect(
        "Driver={SQL Server Native Client 11.0};Server=MyServerName;Database=MyDbName; uid=MyUsernameLoginDb; pwd=MyDbPasswordLoginToDB; ")