https://github.com/YukiMiyatake/YukiMiyatakeWorks/tree/prj/Python/Pyramid/main Ich werde eine Notiz in diesem Zweig hinterlassen
Ich hatte noch nie an der Rezeption gearbeitet, aber plötzlich war ich für die Rezeption und den Webserver verantwortlich Ich musste eine neue mit Pyramid of Python erstellen, die ich noch nie benutzt habe Hinterlasse eine Notiz (obwohl jetzt) So arbeite ich, wenn ich das Sprachframework zum ersten Mal berühre. Echter Spracherwerb
Dieses Mal werde ich zunächst zwischen Windows- und Mac-PCs hin und her gehen Ich habe beide PCs eingerichtet Ich habe vorerst ein Docker-Image erstellt, aber im Grunde werde ich Python nativ ausführen Der Editor ist ein stabiler VS-Code
miniconda https://docs.conda.io/en/latest/miniconda.html Da Anakonda groß ist, setzen Sie Miniconda Die Verwendung ist wahrscheinlich die gleiche Installieren Sie Python 3.7
VSCode Fügen Sie das Python-Plug-In ein Pythoner ist im Mai ein Fussel, also legen Sie ihn unbedingt ein Es macht mich ausnahmslos wütend auf PEP8. Ich weiß nicht, was PEP8 ist
Irgendwie, was ich aus den Geschichten anderer Leute weiß
Ich weiß das nur, aber ich bin optimistisch, dass es irgendwie zu einer Atmosphäre wird
Ein grober Blick auf Python-Webframework-Vergleiche
Django Full-Stack-Framework Viele Informationen im Web Erste Wahl im Python-Webframework
Bottle WSGI Leichter Rahmen
Flask WSGI Leichter Rahmen
Tornado Nicht blockierende E / A.
Plone
Pyramide hat nicht viele Informationen ...
https://hotframeworks.com/languages/python Framework-Ranking
In den Top 3 mit Django, Flask, Tornado Flasche, AIOHTTP, web.py, Pyramid, web2.py sind ungefähr gleich hoch
Pyramid hat wenig japanische Informationen, so dass es scheint, dass Sie mit englischen Informationen programmieren müssen ...
Wählen Sie ein Python-Projekt mit einem hohen Stern und sehen Sie sich den Code an Mein üblicher Stil, Funktionen zu finden und nach Dingen zu suchen, die ich nicht verstehe
def
und enden mit :. Prototypdeklaration im C-Stil. Kein Rückgabewert oder Typ angegeben* arg
scheint ein Argument variabler Länge ohne Schlüsselwörter zu sein** kwargs
scheint ein Argument variabler Länge mit Schlüsselwörtern zu sein__init__
scheint als Konstruktor zu fungierenclass
mit class name ()
erstellen@ xxx
vor der Funktion hinzufügen, um das Verhalten der Funktion zu ändern. Nannte einen Dekorateur__Init __. Py
Schwierig. Initialisieren Sie das Paket usw. Wenn Sie keine leere Datei erstellen, wird diese nicht normal geladen. Lassen Sie uns tief in die Zukunft grabenBei der obigen Untersuchung ist es notwendig, das Paket erneut zu untersuchen. Ich konnte die Python-Sprache verstehen.
https://trypyramid.com/ https://docs.pylonsproject.org/projects/pyramid/en/latest/ Die Formel scheint oben zu sein
$ pip install pyramid
$ pcreate -s alchemy testapp
$ cd testapp
$ python setup.py develop
$ pserve development.ini
Ich könnte SQL Alchemy (vielleicht ORM) verwenden, also habe ich die Alchemie-Option hinzugefügt und eine Testapp-Vorlage erstellt. Starten Sie den Server mit den Einstellungen von development.ini und greifen Sie auf http: // localhost: 6543 zu Bis zu diesem Punkt
SQLAlchemy ist nicht eingestellt, also im Browser
Pyramid is having a problem using your SQL database. The problem
might be caused by one of the following things:
1. You may need to run the "initialize_testapp_db" script
to initialize your database tables. Check your virtual
environment's "bin" directory for this script and try to run it.
2. Your database server may not be running. Check that the
database server referred to by the "sqlalchemy.url" setting in
your "development.ini" file is running.
After you fix the problem, please restart the Pyramid application to
try it again.
Wird angezeigt Es scheint, dass Sie eine SQLite-Datenbank erstellen müssen, damit sie vorerst funktioniert
$ initialize_testapp_db development.ini
Es bewegte sich leicht
Ich stellte mir eine gelbe Wüste vor, weil sie Pyramide hieß, aber die Bildfarbe scheint rot zu sein
Es scheint, dass Python kompiliert und macht. Legen Sie es in .gitignore ein und entfernen Sie es aus der Quellcodeverwaltung
Ist es operator () in C ++?
Hinzugefügt zu init config des Projektstamms
config.add_jinja2_renderer(".html")
In jinja2 scheint {{}} das Standardtrennzeichen zu sein
block {% extends "layout.html" %} {% block content %} {% endblock content %} Anfangs war es ein Rätsel, aber ich fand es heraus, als ich es ausführte, während ich den HTML-Code darin umschrieb jinja2 scheint in der Lage zu sein, die Vorlage zu erben Basierend auf layout.html. Es ist in erweitert angegeben Und schreiben Sie den übergeordneten Block mit dem Block der untergeordneten Vorlage neu Es scheint, dass Sie eine solche Seite erstellen
dynamic url Ich weiß nicht, ob du es so nennst {{request.static_url('testapp:static/pyramid.png')}} Ich war neugierig auf diesen Teil. Wahrscheinlich aus dem Framework gerendert, anstatt den Pfad direkt zu schreiben Ich denke das ist der Weg Wir werden die Details der Parameter später untersuchen. Es ist ein Rätsel, den Anwendungsnamen einzugeben Weitere Anweisungen finden Sie weiter unten, sodass Sie möglicherweise etwas verwenden https://docs.pylonsproject.org/projects/pyramid/en/latest/api/request.html
routing Befindet sich in route.py
def includeme(config):
config.add_static_view('static', 'static', cache_max_age=3600)
config.add_route('home', '/')
Zuallererst bin ich neugierig, mich einzuschließen https://docs.pylonsproject.org/projects/pyramid/en/latest/api/config.html Ich bin mir nicht sicher, aber auf den ersten Blick ruft Pyramid eine Funktion mit dem Namen includeeme standardmäßig auf (der Funktionsname kann weggelassen werden).
Das erste Argument von config.add_route ist der Name und das zweite Argument ist die URL. Ordnen Sie View dem Namen des ersten Arguments zu
View views/default.py
@view_config(route_name='home', renderer='../templates/mytemplate.html')
def my_view(request):
try:
query = request.dbsession.query(MyModel)
one = query.filter(MyModel.name == 'one').first()
except DBAPIError:
return Response(db_err_msg, content_type='text/plain', status=500)
return {'one': one, 'project': 'testapp'}
view_config Dekorateur. Routenname stimmt mit dem Namen der vorherigen Route überein Renderer ist eine Vorlage zum Rendern Es gibt andere request_method, match_param usw., und es scheint, dass es in verschiedene Fälle unterteilt werden kann. https://docs.pylonsproject.org/projects/pyramid/en/latest/narr/viewconfig.html
Das normale System gibt eine assoziative Sequenz zurück, die eins und ein Projekt enthält. Es wird erwartet, dass der Wert in mytemplate.html gerendert wird. Schlagen.
Wenn Sie Dictionary zurückgeben, wird es wahrscheinlich mit Vorlage gerendert Wenn Sie es mit Antwort usw. zurückgeben, wird es unabhängig ohne Verwendung einer Vorlage gerendert
Erstellen Sie eine neue Seite, indem Sie Routing, Ansicht, Vorlage hinzufügen
Wenn ich das Formular-Tag verwenden würde, könnte ich es einfach mit HTML tun, aber es scheint, dass ich die Formularbibliothek verwenden sollte Es scheint, dass die Pyramide Deform verwendet https://docs.pylonsproject.org/projects/pyramid/en/latest/quick_tutorial/forms.html
Anscheinend scheint es zusammen mit kälter verwendet zu werden Erstellen Sie ein Schema (Klasse), das vom Siebobjekt abgeleitet ist Es scheint, dass die Mitgliedsvariable dieser Klasse = das Element des Formulars ist Sehr angenehm
schema
import colander
from deform.widget import TextAreaWidget
class NewPageSchema(colander.MappingSchema):
username = colander.SchemaNode(colander.String(), title="username",
validator=colander.Length(min=4, min_err='Shorter than minimum length ${min}'),
default="")
Erstellen Sie in der Ansicht eine Instanz dieses Schemas und erstellen Sie ein Formular aus dem Schema Übergeben Sie es einfach an View Da es eine große Sache ist, machen Sie eine Klasse, indem Sie nur die Probe imitieren (Ich kenne Python überhaupt nicht, aber es sieht so aus)
view
class Views(object):
def __init__(self, request):
self.request = request
@reify
def form_(self):
schema = NewPageSchema()
btn = deform.form.Button(name="newpage", title="newpage")
return deform.form.Form(schema, buttons=(btn,), action="/newpage")
@view_config(route_name='home', renderer='../templates/mytemplate.html')
def my_view(self):
form = self.form_.render()
return {"rendered_form": form}
@view_config(route_name="newpage", renderer="../templates/newpage.html")
def newpage(self):
username = self.request.params.get("username", "")
return {"username": username}
Was ist reify ... https://docs.pylonsproject.org/projects/pyramid/en/latest/api/decorator.html
Verhält sich wie eine Python-Eigenschaft, speichert den Wert jedoch als einmal aufgerufenes Wörterbuch I frage mich, was·· Python-Eigenschaften ähneln wahrscheinlich Eigenschaften in anderen Sprachen wie C # Ist es eine Funktion, die ohne () aufgerufen werden kann, oder eine Funktion, die einen Wert zurückgibt? Im Fall von reify wird es jedoch beim ersten Aufruf aufgerufen, danach scheint es jedoch denselben Wert zurückzugeben Da der Wert von außen überschrieben werden kann, ist es etwas seltsam, sich von einer Tonne zu unterscheiden
Im obigen Fall senden Sie das Formular zurück
Die veröffentlichten Parameter können mit request.params.get ("hoge") abgerufen werden.
Die Vorlage ist
{{ rendered_form | safe }}
Das Formular wird nur durch Einfügen der Formularvariablen angezeigt. Ich habe untersucht, was sicher ist, aber dies scheint ein Merkmal von jinja2 zu sein Normalerweise scheint jinja2 Tags beim Rendern zu entkommen, um XSS-Angriffe zu verhindern Als ich sicher deaktiviert habe, wurde der maskierte HTML-Code angezeigt. Wenn Sie jedoch safe hinzufügen, können Sie HTML schreiben, ohne zu entkommen.
Ich habe das Formular noch nicht validiert, aber das Formular ist sehr klar.
https://docs.pylonsproject.org/projects/deform/en/latest/validation.html Selbst wenn ich den Code wie hier gezeigt schreibe, weiß ich nicht, ob CSRFSchema überhaupt importiert werden kann. Es gibt kein Sieb Ich habe es geschafft, solchen Code zu schreiben
Da der Validator im Schema festgelegt ist, können Sie ihn validieren, indem Sie ihn ordnungsgemäß aufrufen.
Holen Sie sich Steuerelemente für die Validierung Ich habe nicht im Detail verfolgt, aber ich denke, es ist der Inhalt und der Wert des Formulars
Wenn Sie Steuerelemente zur Validierung des Formularobjekts übergeben, wird der Validator überprüft Bei NG tritt eine ValidationFailure-Ausnahme auf
Wenn Sie diesmal eine Ausnahme abfangen, werden Sie zu / umgeleitet. Ich möchte einen besseren Weg wissen
if 'newpage' in self.request.params:
controls = self.request.POST.items()
try:
self.form_.validate(controls)
except ValidationFailure as e:
return HTTPFound(location='/')
username = self.request.params.get("username")
email = self.request.params.get("email")
return {"username": username, "email": email }
Bis hierher für diese Zeit. .. .. .. Fahren Sie fort, wenn es Hoffnung gibt
Tag bis zur Gegenwart https://github.com/YukiMiyatake/YukiMiyatakeWorks/tree/pyramid_deform_validation
Recommended Posts