2016-04-01 7 views
0

Ich habe gerade angefangen, Django zu lernen und meine erste Seite zu erstellen. Alles funktioniert ordnungsgemäß, Benutzer können erstellt, angemeldet und abgemeldet werden, aber ein ungewöhnliches Problem tritt auf und ich bin mir nicht sicher, wo ich mit der Fehlerbehebung beginnen soll.Django-Benutzer-Homepage: Eingabe beliebiger Zeichen in URL zeigt die aktuell angemeldete Benutzer-Startseite an?

Nach dem Anmelden leitet die URL zu/home /% username%/um. Das funktioniert. Allerdings kann ich den% username% des aktuellen Benutzers entfernen, eine beliebige Kombination von Zeichenfolgen eingeben und trotzdem zur Startseite des Benutzers geleitet werden.

Kann jemand erklären, warum dies so ist und wie sichergestellt werden kann, dass die URL einen 404-Fehler auslöst, wenn es nicht/home /% zZ in/username%/oder eine andere Site in urls.py ist? Hier ist mein Code:

urls.py

from django.conf.urls import url 

from . import views 
from . import views_accounts 

urlpatterns = [ 
    url(r'^index/', views.index, name='index'), 

    url(r'^home/share/(?P<event_id>[0-9]+)', views.share, name='share'), 
    url(r'^home/(?P<username>[-\w]+)', views.home, name='home'), 

    url(r'^accounts/logout', views_accounts.logout_view, name='logout_view'), 
    url(r'^accounts/create_account', views_accounts.create_account, name='create_account'), 
    url(r'^accounts/login', views_accounts.user_login, name='login'), ] 

views.py

@csrf_exempt 
def index(request): 
    return render(request, 'index.html') 

@csrf_exempt 
@login_required(login_url='/accounts/login/') 
def home(request, username): 
# GET Meetup Event Info from all meetups the user 
# has RSVP'd to and load JSON data into variable 
    # user = User.objects.get(username=username) 

    user = request.user.username 

    meetup_data = get_meetup_events(user) 

# Load HTML template with Meetup data 
    context = {'meetup_data': meetup_data} 
    return render(request, 'home.html', context) 

user_login.py

@csrf_exempt 
def user_login(request): 
    if request.method == 'POST': 
     username = request.POST['username'] 
     password = request.POST['password'] 
     user = authenticate(username=username, password=password) 
     if user is not None: 
      login(request, user) 
      return redirect('/home/%s/' % username) 
    else: 
     return render(request, 'login.html') 

Dank !!

EDIT:

home.html:

{% extends 'base.html' %} 
 
{% block main %} 
 
<main class="container"> 
 

 
<!-- Create account navigation buttons to logout, log in to Facebook and Twitter, and Sync Meetup Data --> 
 
    <div class="social-buttons"> 
 
\t <a class="btn" href="#!">Import Meetup Events</a> 
 
\t <a class="btn" href="{% url 'logout_view' %}">Logout</a> 
 
\t <a class="btn" href="{% url 'social:begin' 'facebook' %}?next={{ request.path }}">Facebook</a> 
 
\t <a class="btn" href="{% url 'social:begin' 'twitter' %}?next={{ request.path }}">Twitter</a> 
 
    </div> 
 

 
<!-- Create a card for each Meetup the user has RSVP'd to that displays the Meetup Group Name, the Event Name, a link to the event, and a link to post the event to Twitter --> 
 
    {% for items in meetup_data %} 
 
\t <div class="card"> 
 
\t <div class="card-content"> 
 
\t \t <span class="card-title"> {{ items.group_name }} </span> 
 
\t \t <img class="right" src="{{items.thumb_link}}" alt=""> 
 
\t \t <p>{{ items.event_name }}<br><br> 
 
\t \t <a href="{{ items.web_link }}">Event Details</a> 
 
\t \t </p> 
 
\t </div> 
 
\t <div class="card-action"> 
 
\t \t <a class="twitter-post" href="{%url 'share' items.event_id %}"> 
 
\t \t <span >Post To Twitter</span> 
 
\t \t </a> 
 
\t </div> 
 
\t </div> 
 
    {% endfor %} 
 

 
</main> 
 
{% endblock %}

+0

Bitte zeigen Sie die Vorlage 'home.html' an. – Alasdair

+0

Beachten Sie, dass es eine gute Idee ist, Ihre Regexe mit einem Dollar zu beenden, z. '^ index/$', sonst passen sie auch zu anderen URLs wie '/ index/some-other-stuff'. – Alasdair

+0

Es ist eine schlechte Idee, 'csrf_exempt' zu verwenden, Sie machen Ihre Benutzer anfällig für CSRF-Angriffe. – Alasdair

Antwort

1

Da Sie den Benutzernamen in der URL übergeben sind zu ignorieren - Sie aus der Linie kommentiert, wo es sie in der uses Abfrage - und Sie erhalten es direkt von request.user stattdessen.

Beachten Sie, dass dies die richtige Vorgehensweise ist, da Sie nicht möchten, dass Personen auf die Homepages anderer Benutzer zugreifen. Daher sollten Sie den Benutzernamen aus der URL entfernen.

+0

Das Kommentarzeichen für die Zeile, die ich auskommentiert habe und den request.user-Teil auskommentiert, verhindert, dass zufällige Abfragen funktionieren, erlaubt mir jedoch, Benutzernamen anderer Benutzer zu verwenden, die in der Datenbank gespeichert sind, um auf die Homepage zuzugreifen. Das Entfernen der Benutzernamen Regex von URLs und das Argument Benutzername bleibt immer noch das gleiche Problem: jede Zeichenfolge führt mich auf die Homepage des angemeldeten Benutzers. Wie würde ich den Benutzernamen in der URL sicher verwenden? – joshcrim

+0

Aber warum ist der zweite Fall wichtig? Wenn Sie immer die Daten des eingeloggten Benutzers anzeigen, ist es egal, was die Zeichenfolge in der URL ist. Beachten Sie, dass das Hinzufügen des $ wie Alasdair empfiehlt, dass sie keine Zeichenfolge nach/home/hinzufügen können. –

+0

Fair genug, jetzt, wo ich darüber nachdenke, wenn ich den Benutzernamen in der URL auf anderen Websites sehe, ist es normalerweise ein öffentliches Profil. Was in diesem Zusammenhang sehr sinnvoll wäre.Ich nehme an, für das private Profil gibt es wirklich keinen Grund, es in die URL aufzunehmen! Schätze die Tipps – joshcrim

Verwandte Themen