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 %}
Bitte zeigen Sie die Vorlage 'home.html' an. – Alasdair
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
Es ist eine schlechte Idee, 'csrf_exempt' zu verwenden, Sie machen Ihre Benutzer anfällig für CSRF-Angriffe. – Alasdair