python - Django render_to_response 未按预期工作

标签 python django authentication render-to-response

Django 1.5 - django-ldap-auth

尝试找出如何正确使用 request_to_context,因为它仅适用于 login.html 页面本身。 (user.is_authenticated 等)。

用户登录后,会将用户转发到/reboot。从那里我想使用 {{ user.is_authenticated }}/{{ user.username }},但没有显示任何内容(true 或 false)。它只是空白。

在login.html页面本身上它们可以正常工作。如果我渲染到reboot/index.html,它不会渲染我有索引的代码。我假设在用户通过身份验证后我将能够调用这些命令。希望我只是遗漏了这个难题的一小部分。

我已经包含了所有必要的代码。如果您需要其他东西,请告诉我。

这是我的布局。

重新启动/form.py

from django import forms
from django.contrib.auth.models import User
from django.forms import ModelForm

class LoginForm(forms.Form):
    username    = forms.CharField(label=(u'User Name'))
    password    = forms.CharField(label=(u'Password'), widget=forms.PasswordInput(render_value=False))

View .py

from django.template import Context, loader, RequestContext
from django.shortcuts import render_to_response
from django.contrib.auth.decorators import login_required
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.models import User
from django.http import HttpResponse, HttpResponseRedirect
from servers.models import Server
from reboot.forms import LoginForm
import paramiko
import socket

def logout_user(request):
    logout(request)
    return HttpResponseRedirect('/status/')

def index(request):
  t = loader.get_template('reboot/index.html')
  servers = Server.objects.all()
  c = Context( {
    'servers': servers,
  })
  return HttpResponse(t.render(c))

def test_ssh_liveness(ssh, name):
  try:
    ssh.connect(name, timeout='1')
    return True
  except socket.timeout:
    # server is down
    return False
  except socket.gaierror:
    # invalid server name
    return False
  except paramiko.SSHException:
    # unknown host key
    return True

def server(request, name):
  ssh = paramiko.SSHClient()
  is_alive = test_ssh_liveness(ssh, name)
  return HttpResponse("You selected server "+name+" and it is "+str(is_alive))

# user login
def login_user(request):
    if request.user.is_authenticated():
        # return HttpResponseRedirect('/reboot/')
        pass
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username=username, password=password)
        if user is not None:
            if user.is_active:
                login(request, user)
                return HttpResponseRedirect('/reboot/')
        else:
            return render_to_response('login.html', {'form', form}, context_instance=RequestContext(request))
    else:
        ''' user is not submitting the form, show the login form '''
        form = LoginForm()
        context = {'form': form}
        return render_to_response('login.html', context, context_instance=RequestContext(request))

reboot.url

from django.conf.urls import patterns, url     
from reboot import views

urlpatterns = patterns('',
    url(r'^$', views.index, name='index'),
    #(r'^$', views.login_user),
    url(r'^server/(?P<name>[^/]+)', views.server, name='server')
)

主 URL 文件

from django.conf.urls import patterns, include, url 
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
    url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
    url(r'^admin/', include(admin.site.urls)),

    url(r'^reboot/', include('reboot.urls')),
    # Login for reboot 
    (r'^login/$', 'reboot.views.login_user'),
    (r'^logout/$', 'reboot.views.logout_user'),

    url(r'^status/', include('status.urls')),
)

登录.html

% extends "base.html" %}
{% block content %}
<p> print {{ user.is_authenticated }}</p>
    <div id="login">
        <form class="form-horizontal" name="LoginForm" action="/login/" method="post">
        {% csrf_token %}
        {% if next %}
            <input type="hidden" name="next" value="{{ next }}" />
        {% endif %}

        <div class="control-group">
            <label class="control-label" for="username">Username</label>
            <div class="controls">
                <input type="text" id="username" name="username" placeholder="Username">
            </div>
        </div>

        <div class="control-group">
            <label class="control-label" for="password">Password</label>
            <div class="controls">
                <input type="password" name="password" id="password" placeholder="Password">
            </div>
        </div>

        <div class="control-group">
            <div class=controls">
                <button type="submit" class="btn">Login</button>
            </div>
        </div>

        </form>
    </div>

{% endblock %}

/reboot/index.html

{% extends "base.html" %}

{% block title %}Server{% endblock %}

{% block content %}
<h2>Server Control Panel</h2>
<h4>Welcome, print {{ user.is_authenticated }}.</h4>
{% if user.is_authenticated %}<p><a href="/logout/">Logout</a></p>{% else %}<a href="/login/">Login</a></p>{% endif %}
    <p class="lead">
    The servers below correspond to servers that you have access to. 
    If you believe there are errors, please <a href="mailto:jz@tripadvisor.com">contact me.</a>
    </p>
<div class="container-fluid">
<table class="table table-hover">
  <thead>
    <tr>
        <th><h4>Hostname</h4></th>
        <th><h4>Commands</h4></th>
    </tr>
  </thead>
  <tbody>
  {% for server in servers %}
    <tr>
        <td><a href="{% url 'server' server.hostname %}" class="btn">{{ server.hostname }}</a></td>
        <td>
            <a href="#" class="btn btn-success">start</a>
            <a href="#" class="btn btn-warning">restart</a>
            <a href="#" class="btn btn-danger">shutdown</a>
        </td>
    </tr>
  {% endfor %}
  </tbody>
</table>
</table>
</div>
{% endblock %}

感谢您的所有帮助。我已经被这个问题困扰了好几天了,一直没能弄清楚。

约翰

最佳答案

您的 View 需要一个 RequestContext 实例 ( docs ),就像您的登录 View 一样,因此它知道哪个用户已登录(以及其他内容)。所以代替:

def index(request):
    t = loader.get_template('reboot/index.html')
    servers = Server.objects.all()
    c = Context( {
      'servers': servers,
    })
    return HttpResponse(t.render(c))

只要做到:

def index(request):
    servers = Server.objects.all()
    context = {
      'servers': servers,
    }
    return render_to_response('reboot/index.html', context, context_instance=RequestContext(request))

编辑

这实际上与render_to_response无关。正如导入所说,这只是一个快捷方式。

Django 的上下文处理器(基本上,向模板上下文添加变量的函数)是基于请求的,因此只有在指定 RequestContext 时才会被调用,其中包括 django.contrib .auth.context_processors.auth,将 user 变量包含到模板中的上下文处理器。

您的代码的等效项是:

def index(request):
    t = loader.get_template('reboot/index.html')
    servers = Server.objects.all()
    c = RequestContext(request, {
      'servers': servers,
    })
    return HttpResponse(t.render(c))

关于python - Django render_to_response 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18516370/

相关文章:

python - spaCy:概括一个语言工厂,它获取正则表达式以在文本中创建跨度

javascript - 构建 API

Python无法从字典列表中创建字典

PHP : Must login twice until session variables are set

javascript - Javascript 中的对象与数组就像 Python 的字典与列表?

python - 将列表的元组列表写入文本文件

security - kafka中如何实现OAUTHBEARER SASL认证机制?

ruby-on-rails - 使用新设备对移动应用进行身份验证

python - 使用 matplotlib 绘制数组列表

python - 有限的 celery 节拍任务