Plötzlich musste ich mit Python und Pyramid an einem Projekt arbeiten, also eine Notiz darüber, wie ich lerne

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

Umgebung

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

Python-Syntax

Vorherige Kenntniss

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

Rahmenvergleich

Ein grober Blick auf Python-Webframework-Vergleiche

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 ...

Erraten Sie, während Sie sich den Github-Code ansehen

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

Bei der obigen Untersuchung ist es notwendig, das Paket erneut zu untersuchen. Ich konnte die Python-Sprache verstehen.

Starten Sie die Entwicklung

Projekterstellung

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

SnapCrab_NoName_2020-1-7_23-27-51_No-00.png

Ich stellte mir eine gelbe Wüste vor, weil sie Pyramide hieß, aber die Bildfarbe scheint rot zu sein

Ich werde untersuchen, was mir wichtig ist

pychache wird willkürlich erstellt, überprüfen Sie es also

Es scheint, dass Python kompiliert und macht. Legen Sie es in .gitignore ein und entfernen Sie es aus der Quellcodeverwaltung

call Mit () können Sie eine Instanz aufrufen, die sich vom Konstruktor unterscheidet.

Ist es operator () in C ++?

Ich möchte die Erweiterung .jinja2 der Ansicht ändern.

Hinzugefügt zu init config des Projektstamms

    config.add_jinja2_renderer(".html")

Vorlagen-Trennzeichen

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

Umgestalten und erinnern

Ansicht hinzufügen

Erstellen Sie eine neue Seite, indem Sie Routing, Ansicht, Vorlage hinzufügen

POST vom Formular

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.

Validierung durchführen

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

Plötzlich musste ich mit Python und Pyramid an einem Projekt arbeiten, also eine Notiz darüber, wie ich lerne
Ich habe versucht, ein Projekt mit Python on Docker mit PyCharm zu erstellen, aber es hat mit Docker Compose funktioniert
Hinweise zum Erstellen einer LAMP-Umgebung mit Vagrant und VirtulBox
Ich habe versucht, mit Python einen regulären Ausdruck für "Betrag" zu erstellen
[Python] Ich habe versucht, eine stabile Sortierung zu implementieren
Ich habe versucht, mit Python einen regulären Ausdruck von "Zeit" zu erstellen
Ich habe versucht, mit Python einen regulären Ausdruck von "Datum" zu erstellen
So erstellen Sie eine Python-Umgebung mit Virtualenv unter Ubuntu 18.04 LTS
Ich habe viel recherchiert, wie Python ausgeführt wird
Wie man Python 3.x und 2.x auf einem Mac koexistiert (ich habe auch opencv als Bonus hinzugefügt)
Ich habe versucht, den Unterschied zwischen A + = B und A = A + B in Python herauszufinden
[Fabric] Ich war süchtig danach, Boolesche Werte als Argument zu verwenden. Notieren Sie sich also die Gegenmaßnahmen.
Ich habe ein Beispiel für den Zugriff auf Salesforce mit Python und Bottle erstellt
Ich möchte eine Webanwendung mit React und Python Flask erstellen
Arbeitsmemorandum (Pymongo) Teil 3. Ich möchte es nicht noch einmal überprüfen, also notieren Sie es sich (Aggregat)
[Circuit x Python] So ermitteln Sie die Übertragungsfunktion eines Schaltkreises mit Lcapy
So erstellen Sie eine Umgebung für die Verwendung mehrerer Python-Versionen auf einem Mac
Ich habe ein Skript erstellt, das das aktive Fenster mit win32gui von Python aufzeichnet
Beachten Sie, dass ich süchtig danach war, TensowFlow einzurichten
Was tun, wenn matplotlib über CentOS wütend wird und sagt: "Ich verwende Agg, damit ich keine Zahl ausgeben kann."
Ich habe versucht, das Update von "Werde ein Romanautor" mit "IFTTT" und "Werde ein Romanautor API" zu benachrichtigen.
So erstellen Sie eine schöne Python-Umgebung auf einem neuen Mac und installieren Jupter Notebook
Ich möchte einen Screenshot der Site in Docker mit einer beliebigen Schriftart erstellen
So stellen Sie pyenv unter Amazon Linux und Ubuntu ein, um eine Python 3.6.0-Umgebung zu erstellen
Ich bin an php + twig gewöhnt, also habe ich die Template-Engine von Pyramid 1.5 auf jinja2 geändert.
Python-Anfänger haben einen Chat-BOT erstellt, also habe ich versucht, zusammenzufassen, wie man es macht
Ich habe versucht zusammenzufassen, wie man Matplotlib von Python verwendet
So schreiben Sie einen Listen- / Wörterbuchtyp von Python3
Ich bin auf MoviePy gestoßen, machen Sie sich also eine Notiz
So erstellen Sie eine Django (Python) -Umgebung auf Docker
Ich möchte mit einem Roboter in Python arbeiten.
So erstellen Sie ein Python-Paket mit VS Code
So führen Sie einen Befehl mit einem Unterprozess in Python aus
Ich habe versucht, Python (3) anstelle eines Funktionsrechners zu verwenden
So erstellen Sie eine Python-Umgebung unter Amazon Linux 2
Python Hinweis: Das Rätsel, einer Variablen eine Variable zuzuweisen
So erstellen Sie eine virtuelle Ausführungsumgebung für Python mit Visual Studio Code und pipenv auf einem Windows-Computer (auch Jupyter-Notebook)
Die parallele Verarbeitung der Python-Joblib funktioniert in der uWSGI-Umgebung nicht. Wie verarbeite ich parallel auf uWSGI?
So starten Sie einen einfachen WEB-Server, der CGI von PHP und Python ausführen kann
So erstellen Sie eine Instanz einer bestimmten Klasse aus dict mit __new__ () in Python
[Python] So löschen Sie eine Zeile / Spalte in einer Tabelle (Liste der Optionen für die Drop-Methode)
Ich möchte eine Karaoke-Klangquelle erstellen, indem ich Instrumente und Gesang mit Python trenne
Wie man die Anzahl der GPUs aus Python kennt ~ Hinweise zur Verwendung von Multiprocessing mit pytorch ~
Ich habe eine Funktion zum Trimmen des Bildes von Python openCV erstellt. Verwenden Sie sie daher bitte.
So zeichnen Sie einfach die Struktur eines neuronalen Netzwerks in Google Colaboratory mit "convnet-drawer"
Ich möchte einen Sprachwechsler mit Python und SPTK in Bezug auf eine berühmte Site erstellen
[Python] So erstellen Sie eine Liste von Zeichenfolgen Zeichen für Zeichen
So erstellen Sie eine neue virtuelle Python-Umgebung unter Ubuntu
[Python] Zusammenfassung zum Abrufen von Listen und Wörterbuchelementen
So mischen Sie einen Teil der Python-Liste (at random.shuffle)
Ich möchte viele Prozesse von Python aus starten
[Python] Zusammenfassung der Verwendung von Split- und Join-Funktionen
Ich habe versucht "Wie man eine Methode in Python dekoriert"
So entwickeln Sie in einer virtuellen Python-Umgebung [Memo]
Vergleich der Verwendung von Funktionen höherer Ordnung in Python 2 und 3
So registrieren Sie ein Paket in PyPI (Stand September 2017)
So erhalten Sie eine Liste der integrierten Ausnahmen für Python
Ich möchte die Natur von Python und Pip kennenlernen
Ich habe eine Stoppuhr mit tkinter mit Python gemacht
So schreiben Sie eine Meta-Klasse, die sowohl Python2 als auch Python3 unterstützt
Ich habe Chatbot mit LINE Messaging API und Python erstellt