Zunächst werde ich das Konzept von CRUD erläutern, das in Webanwendungen gut zu wissen ist. CRUD ist eine Abkürzung für Erstellen, Lesen, Aktualisieren und Löschen. Am Beispiel dieser Anwendung bedeutet dies Folgendes.
Teilen Sie views.py vor dem Hinzufügen der CRUD-Funktionalität in drei Teile: cafe.py, logging.py und review.py. Erstellen Sie einen Ansichtsordner unter dem Ordner cafe_site und erstellen Sie darin die Dateien cafe.py, loging.py, reviews.py. Blueprint Verwenden Sie Blueprint, um die Ansichtsdatei für jede zuvor erstellte Datei aufzuteilen und in eine Anwendung umzuwandeln.
python:./cafe_site/views/cafe.py
from flask import Blueprint
cafe = Blueprint('cafe', __name__)
python:./cafe_site/views/loging.py
from flask import Blueprint
loging = Blueprint('loging', __name__)
python:./cafe_site/views/review.py
from flask import Blueprint
review = Blueprint('review', __name__)
Und da der Anwendungsname in ** cafe **, ** logging **, ** review ** anstelle von ** app ** geändert wurde, lautet das Routing auch @ cafe.route ()
, @ logging.route. Wechseln Sie zu ()
,@ review.route ()
,.
Ändern Sie als Nächstes den Teil der Datei **. / Cafe_site / __ init__.py **, der Ansichten importiert.
python:./__init__.py
from cafe_site.views.cafe import cafe
app.register_blueprint(cafe)
from cafe_site.views.loging import loging
app.register_blueprint(loging)
from cafe_site.views.reviews import review
app.register_blueprint(review, url_prefix='/users')
Jetzt können Sie reviews.py für Funktionen aktualisieren, die sich auf zukünftige Artikel beziehen, logging.py für Funktionen, die sich auf die Anmeldung beziehen, und cafe.py für Funktionen, die sich auf die Cafe-Homepage beziehen.
Abschließend möchte ich einen Dekorator für die Login-Authentifizierung erstellen, der die Login-Authentifizierung vereinfacht, bevor ich mit dem Hinzufügen der CRUD-Funktionalität fortfahre.
python:./cafe_site/views/loging.py
from functools import wraps
def login_required(loging):
@wraps(loging)
def inner(*args, **kwargs):
if not session.get('logged_in'):
return redirect(url_for('loging.login'))
return loging(*args, **kwargs)
return inner
Bei Prozessen, für die eine Anmeldung erforderlich ist, kann die Anmeldeauthentifizierung einfach durch Hinzufügen des Satzes @login_required unmittelbar vor der Ansichtsmethode durchgeführt werden.
Beginnen wir mit der Erstellung der Artikelposting-Funktion. [Erstellen einer Webanwendung mit Flask ③] Verwenden Sie die in () erstellte Datenbankfunktion, um eine Artikelbuchungsfunktion zu erstellen.
Bearbeiten Sie theme.html und fügen Sie der Navigationsleiste einen Link "Überprüfung" für neue Beiträge hinzu.
html:./cafe_site/templates/theme.html
<ul class="main-nav">
{% if not session.logged_in %}
{% else %}
<li><a href="{{ url_for('review.new_review') }}">review</a></li>
{% endif %}
</ul>
html:./cafe_site/templates/theme.html
<!DOCTYPE html>
<html lang="ja">
<head>
{% block head %}
<meta charset="utf-8">
<title>{% block title %}{% endblock %}</title>
<meta name="description" content="Café, das Arbeitsraum bietet">
<link rel="icon" type="image/png" href="/static/images/favicon.png ">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- CSS -->
<link rel="stylesheet" href="https://unpkg.com/ress/dist/ress.min.css">
<link href="https://fonts.googleapis.com/css?family=Philosopher" rel="stylesheet">
<link href="/static/style.css" rel="stylesheet">
{% endblock %}
</head>
<body>
<div id="{{ id }}" class="big-bg">
<header class="page-header wrapper">
<h1><a href="/"><img class="logo" src="/static/images/logo.svg" alt="Kaffeehaus nach Hause"></a></h1>
<nav>
<ul class="main-nav">
{% if not session.logged_in %}
<li><a href="{{ url_for('cafe.news') }}">News</a></li>
<li><a href="{{ url_for('cafe.menu') }}">Menu</a></li>
<li><a href="{{ url_for('cafe.contact') }}">Contact</a></li>
<li><a href="{{ url_for('loging.login') }}">login</a></li>
{% else %}
<li><a href="{{ url_for('cafe.news') }}">News</a></li>
<li><a href="{{ url_for('cafe.menu') }}">Menu</a></li>
<li><a href="{{ url_for('cafe.contact') }}">Contact</a></li>
<li><a href="{{ url_for('review.new_review') }}">review</a></li>
<li><a href="{{ url_for('review.show_reviews') }}">board</a></li>
<li><a href="{{ url_for('loging.logout') }}">logout</a></li>
{% endif %}
</ul>
</nav>
</header>
{% for message in get_flashed_messages() %}
<div class="alert">
<font color="red">
<p>※{{ message }}</p>
</font>
</div>
{% endfor %}
{% block content %}
{% endblock %}
</div>
{% block content2 %}
{% endblock %}
{% block footer %}
{% endblock %}
</body>
</html>
python:./cafe_site/views/reviews.py
@review.route('/reviews/new', methods=['GET'])
@login_required
def new_review():
return render_template('reviews/review.html', id="review")
Bearbeiten Sie abschließend die in Erstellen einer Webanwendung mit Flask ① erstellte Datei review.html ein wenig.
html:./cafe_site/templates/views/reviews.html
{% extends "theme.html" %}
{% block title %}Coffee House{% endblock %}
{% block head %}
{{ super() }}
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
{% endblock %}
{% block content %}
<div class="form-content wrapper">
<h2 class="page-title">Review</h2>
<form method="POST" action="{{ url_for('review.add_review') }}">
<div class="star-rating">
<div class="star-rating__wrap">
<input class="star-rating__input" id="star-rating-5" type="radio" name="star" value=5>
<label class="star-rating__ico fa fa-star-o fa-lg" for="star-rating-5" title="5 out of 5 stars"></label>
<input class="star-rating__input" id="star-rating-4" type="radio" name="star" value=4>
<label class="star-rating__ico fa fa-star-o fa-lg" for="star-rating-4" title="4 out of 5 stars"></label>
<input class="star-rating__input" id="star-rating-3" type="radio" name="star" value=3>
<label class="star-rating__ico fa fa-star-o fa-lg" for="star-rating-3" title="3 out of 5 stars"></label>
<input class="star-rating__input" id="star-rating-2" type="radio" name="star" value=2>
<label class="star-rating__ico fa fa-star-o fa-lg" for="star-rating-2" title="2 out of 5 stars"></label>
<input class="star-rating__input" id="star-rating-1" type="radio" name="star" value=1>
<label class="star-rating__ico fa fa-star-o fa-lg" for="star-rating-1" title="1 out of 5 stars"></label>
</div>
</div>
<div>
<label for="title">Titel</label>
<input placeholder="title" name="title" type="text"/>
</div>
<div>
<label for="message">Botschaft</label>
<textarea id="message" placeholder="message" name="text"></textarea>
</div>
<input type="submit" class="button" value="Post">
</form>
</div>
{% endblock %}
{% block footer %}
<footer>
<div class="wrapper">
<p><small>© Coffee House</small></p>
</div>
</footer>
{% endblock %}
Bisher haben wir ein Anmeldeformular erstellt. Erstellen Sie als Nächstes eine Funktion zum Speichern der aus dem Buchungsformular veröffentlichten Artikel in der Datenbank.
In review.html wird das Formular an gesendet
action =" {{url_for ('review.add_review')}} "
. Erstellen Sie ** review.add_review ** und fügen Sie einen Prozess hinzu, um den veröffentlichten Inhalt zu erhalten und in der Datenbank zu speichern. Fügen Sie ** add_review ** zu views / reviews.py hinzu.
python:./cafe_site/views/reviews.py
@review.route('/reviews', methods=['POST'])
@login_required
def add_review():
review = Review(
star=request.form['star'],
title=request.form['title'],
text=request.form['text']
)
db.session.add(review)
db.session.commit()
flash('Neuer Artikel erstellt')
return redirect(url_for('review.show_reviews'))
Geben Sie wie bei der Erstellung des Anmeldeformulars beim Senden von Daten die POST-Methode an. Wir bearbeiten, ob Sie mit @login_required angemeldet sind. Wenn Sie angemeldet sind, verwenden Sie das im vorherigen Kapitel erstellte Überprüfungsmodell, um eine Modellinstanz für den Titel und den gesendeten Inhalt des Artikels zu erstellen.
python:./cafe_site/views/reviews.py
review = Review(
star=request.form['star'],
title=request.form['title'],
text=request.form['text']
)
Führen Sie dann für die erstellte Modellinstanz die folgende Verarbeitung durch, um den neuen Artikelinhalt in der Datenbank zu speichern.
python:./cafe_site/views/reviews.py
db.session.add(review)
db.session.commit()
db.session.add ()
fügt neuen Inhalt hinzu und db.session.commit ()
schreibt die Daten in die Datenbank.
Fügen Sie als Nächstes eine Blog-Detailfunktion hinzu, damit Details wie der Artikelkörper angezeigt werden.
Fügen Sie zusätzlich zu jedem Titel auf dem Listenbildschirm einen Link "Weitere Informationen" hinzu.
html:./cafe_site/templates/views/index.html
{% extends "theme.html" %}
{% block title %}Coffee House{% endblock %}
{% block head %}
{{ super() }}
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
{% endblock %}
{% block content %}
<div class="wrapper">
<h2 class="page-title">board</h2>
{% for review in reviews %}
<div class="card bg-transparent">
<div class="card-body">
{% if review.star == 1 %}
<h5 class="card-title">rating : <img src="/static/images/star.png " width="15" height="15"></h5>
{% endif %}
{% if review.star == 2 %}
<h5 class="card-title">rating : <img src="/static/images/star.png " width="15" height="15"><img src="/static/images/star.png " width="15" height="15"></h5>
{% endif %}
{% if review.star == 3 %}
<h5 class="card-title">rating : <img src="/static/images/star.png " width="15" height="15"><img src="/static/images/star.png " width="15" height="15"><img src="/static/images/star.png " width="15" height="15"></h5>
{% endif %}
{% if review.star == 4 %}
<h5 class="card-title">rating : <img src="/static/images/star.png " width="15" height="15"><img src="/static/images/star.png " width="15" height="15"><img src="/static/images/star.png " width="15" height="15"><img src="/static/images/star.png " width="15" height="15"></h5>
{% endif %}
{% if review.star == 5 %}
<h5 class="card-title">rating : <img src="/static/images/star.png " width="15" height="15"><img src="/static/images/star.png " width="15" height="15"><img src="/static/images/star.png " width="15" height="15"><img src="/static/images/star.png " width="15" height="15"><img src="/static/images/star.png " width="15" height="15"></h5>
{% endif %}
<h5 class="card-subtitle">{{ review.title }}</h5>
<a class="card-link" href="{{ url_for('review.show_review', id=review.id) }}" >Weiterlesen</a>
</div>
</div>
{% else %}
Keine Beiträge
{% endfor %}
</div>
{% endblock %}
{% block footer %}
<footer>
<div class="wrapper">
<p><small>© Coffee House</small></p>
</div>
</footer>
{% endblock %}
Hier wurden Argumente zu "{{url_for ('review.show_review', id = review.id)}}" und "url_for" hinzugefügt. Dadurch kann die ID des Artikels, auf den Sie geklickt haben, beim Aufruf von show_review () übergeben werden.
Fügen Sie eine neue show_review zu views / reviews.py hinzu.
python:./cafe_site/views/reviews.py
@review.route('/board')
@login_required
def show_reviews():
reviews = Review.query.order_by(Review.id.desc()).all()
return render_template('reviews/index.html', reviews=reviews, id="board")
@review.route('/reviews/<int:id>', methods=['GET'])
@login_required
def show_review(id):
review = Review.query.get(id)
return render_template('reviews/show.html', review=review, id="show")
Geben Sie in "reviews = Review.query.order_by (Review.id.desc ()). All ()" die in url_for übergebene Variable * id * an. Fügen Sie außerdem show_review (id) und den Argumentnamen hinzu, damit auf die Variable * id * verwiesen werden kann.
In der show_review-Methode können Sie den Artikel mit der übergebenen ID aus der Datenbank abrufen, indem Sie einfach "review = Review.query.get (id)" schreiben.
Erstellen Sie abschließend eine show.html-Datei, um die Details des Artikelinhalts anzuzeigen.
html:./cafe_site/templates/views/show.html
{% extends "theme.html" %}
{% block title %}Coffee House{% endblock %}
{% block head %}
{{ super() }}
{% endblock %}
{% block content %}
<div class="show-content wrapper">
<h2>{{ review.title }}</h2>
{% if review.star == 1 %}
<h2>Auswertung: <img src="/static/images/star.png " width="40" height="40"></h2>
{% endif %}
{% if review.star == 2 %}
<h2>rating : <img src="/static/images/star.png " width="40" height="40"><img src="/static/images/star.png " width="40" height="40"></h2>
{% endif %}
{% if review.star == 3 %}
<h2>rating : <img src="/static/images/star.png " width="40" height="40"><img src="/static/images/star.png " width="40" height="40"><img src="/static/images/star.png " width="40" height="40"></h2>
{% endif %}
{% if review.star == 4 %}
<h2>rating : <img src="/static/images/star.png " width="40" height="40"><img src="/static/images/star.png " width="40" height="40"><img src="/static/images/star.png " width="40" height="40"><img src="/static/images/star.png " width="40" height="40"></h2>
{% endif %}
{% if review.star == 5 %}
<h2>rating : <img src="/static/images/star.png " width="40" height="40"><img src="/static/images/star.png " width="40" height="40"><img src="/static/images/star.png " width="40" height="40"><img src="/static/images/star.png " width="40" height="40"><img src="/static/images/star.png " width="40" height="40"></h2>
{% endif %}
<br> {{ review.text|safe }}
<br>
<br>Datum und Uhrzeit veröffentlichen{{ review.created_at }}
</div>
{% endblock %}
Fügen Sie eine Artikelbearbeitungsfunktion hinzu, damit Sie den veröffentlichten Artikel bearbeiten können.
Fügen Sie dem Artikeldetails-Bildschirm eine Schaltfläche "Bearbeiten" hinzu.
html:./cafe_site/templates/views/show.html
<form action="{{ url_for('review.edit_review', id=review.id) }}" method="GET">
<input type="submit" class="button" value="Bearbeiten">
</form>
Fügen Sie edit_review zu views / reviews.py hinzu, damit der Bearbeitungsbildschirm zurückgegeben wird, wenn Sie auf die Schaltfläche Bearbeiten klicken.
python:./cafe_site/views/reviews.py
@review.route('/reviews/<int:id>/edit', methods=['GET'])
@login_required
def edit_review(id):
review = Review.query.get(id)
return render_template('reviews/edit.html', review=review)
Erstellen Sie eine neue edit.html und erstellen Sie einen Bearbeitungsbildschirm.
html:./cafe_site/templates/views/edit.html
{% extends "theme.html" %}
{% block title %}Coffee House{% endblock %}
{% block head %}
{{ super() }}
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
{% endblock %}
{% block content %}
<div class="edit wrapper">
<h2 class="page-title">review</h2>
<form action="{{ url_for('review.update_review', id=review.id) }}" method=post class=add-review>
<div class="star-rating">
<div class="star-rating__wrap">
<input class="star-rating__input" id="star-rating-5" type="radio" name="star" value=5>
<label class="star-rating__ico fa fa-star-o fa-lg" for="star-rating-5" title="5 out of 5 stars"></label>
<input class="star-rating__input" id="star-rating-4" type="radio" name="star" value=4>
<label class="star-rating__ico fa fa-star-o fa-lg" for="star-rating-4" title="4 out of 5 stars"></label>
<input class="star-rating__input" id="star-rating-3" type="radio" name="star" value=3>
<label class="star-rating__ico fa fa-star-o fa-lg" for="star-rating-3" title="3 out of 5 stars"></label>
<input class="star-rating__input" id="star-rating-2" type="radio" name="star" value=2>
<label class="star-rating__ico fa fa-star-o fa-lg" for="star-rating-2" title="2 out of 5 stars"></label>
<input class="star-rating__input" id="star-rating-1" type="radio" name="star" value=1>
<label class="star-rating__ico fa fa-star-o fa-lg" for="star-rating-1" title="1 out of 5 stars"></label>
</div>
</div>
<div>
<label for="name">Titel</label>
<input placeholder="Titel" name="title" type="text" value={{ review.title }}/>
</div>
<div class="form-group">
<label for="message">Botschaft</label>
<textarea id="message" placeholder="Rezension" name="text">{{ review.text | safe }}</textarea>
</div>
<input type="submit" class="button" value="aktualisieren">
</form>
{% endblock %}
{% block footer %}
<footer>
<div class="wrapper">
<p><small>© Coffee House</small></p>
</div>
</footer>
{% endblock %}
Erstellen Sie update_review in reviews.py und fügen Sie einen Prozess hinzu, um die im Formular eingegebenen Änderungen zu erhalten und die Datenbank zu aktualisieren.
python:./cafe_site/views/reviews.py
@review.route('/reviews/<int:id>/update', methods=['POST'])
@login_required
def update_review(id):
review = Review.query.get(id)
review.star = request.form['star']
review.title = request.form['title']
review.text = request.form['text']
db.session.merge(review)
db.session.commit()
flash('Artikel aktualisiert')
return redirect(url_for('review.show_reviews'))
** Stern **, ** Titel **, ** Text ** werden für die von Review.query.get (id)
erhaltene Überprüfung aktualisiert.
Verwenden Sie beim Erstellen, Hinzufügen, aber beim Aktualisieren "db.session.merge (review)" und schließlich "db.session.commit ()", um die Datenbank zu aktualisieren.
Fügen Sie schließlich die Möglichkeit hinzu, Artikel zu löschen.
html:./cafe_site/templates/views/show.html
<form action="{{ url_for('review.delete_review', id=review.id) }}" method="post">
<input type="submit" class="button" value="Löschen">
</form>
Fügen Sie ** delete_review ** zu views / reviews.py hinzu und fügen Sie einen Prozess zum Löschen des Artikels hinzu, wenn Sie auf die Schaltfläche Löschen klicken.
python:./cafe_site/views/reviews.py
@review.route('/reviews/<int:id>/delete', methods=['POST'])
@login_required
def delete_review(id):
review = Review.query.get(id)
db.session.delete(review)
db.session.commit()
flash('Beitrag gelöscht')
return redirect(url_for('review.show_reviews'))
Um den Inhalt der Datenbank zu löschen, geben Sie "db.session.delete (review)" an. Sie haben jetzt alle Funktionen von CRUD hinzugefügt. Schauen wir uns zum Schluss das Gesamtbild von reviews.py an.
python:./cafe_site/views/reviews.py
from flask import request, redirect, url_for, render_template, flash, session
from cafe_site import db
from cafe_site import app
from cafe_site.models.reviews import Review
from cafe_site.views.loging import login_required
from flask import Blueprint
review = Blueprint('review', __name__)
@review.route('/board')
@login_required
def show_reviews():
reviews = Review.query.order_by(Review.id.desc()).all()
return render_template('reviews/index.html', reviews=reviews, id="board")
@review.route('/reviews', methods=['POST'])
@login_required
def add_review():
review = Review(
star=request.form['star'],
title=request.form['title'],
text=request.form['text']
)
db.session.add(review)
db.session.commit()
flash('Neuer Artikel erstellt')
return redirect(url_for('review.show_reviews'))
@review.route('/reviews/new', methods=['GET'])
@login_required
def new_review():
return render_template('reviews/review.html', id="review")
@review.route('/reviews/<int:id>', methods=['GET'])
@login_required
def show_review(id):
review = Review.query.get(id)
return render_template('reviews/show.html', review=review, id="show")
@review.route('/reviews/<int:id>/edit', methods=['GET'])
@login_required
def edit_review(id):
review = Review.query.get(id)
return render_template('reviews/edit.html', review=review)
@review.route('/reviews/<int:id>/update', methods=['POST'])
@login_required
def update_review(id):
review = Review.query.get(id)
review.star = request.form['star']
review.title = request.form['title']
review.text = request.form['text']
db.session.merge(review)
db.session.commit()
flash('Artikel aktualisiert')
return redirect(url_for('review.show_reviews'))
@review.route('/reviews/<int:id>/delete', methods=['POST'])
@login_required
def delete_review(id):
review = Review.query.get(id)
db.session.delete(review)
db.session.commit()
flash('Beitrag gelöscht')
return redirect(url_for('review.show_reviews'))
Die Fortsetzung wird unter Erstellen einer Webanwendung mit Flask ④ erläutert.
Recommended Posts