Soudain, j'avais besoin de travailler sur un projet utilisant Python et Pyramid, donc une note sur la façon dont j'étudie

https://github.com/YukiMiyatake/YukiMiyatakeWorks/tree/prj/Python/Pyramid/main Je vais laisser un mot dans cette branche

Je n'avais jamais fait la réception, mais du coup j'étais en charge de la réception et du serveur web J'avais besoin d'en faire un nouveau avec Pyramid of Python que je n'avais jamais utilisé auparavant Laisser une note (bien que maintenant) C'est ainsi que je travaille lorsque je touche pour la première fois au cadre du langage. Acquisition du langage réel

Tout d'abord, cette fois, je vais travailler en faisant des allers-retours entre les PC Windows et Mac J'ai configuré les deux PC J'ai créé une image Docker pour le moment, mais en gros, je vais exécuter Python en natif L'éditeur est un VS Code stable

Environnement

miniconda https://docs.conda.io/en/latest/miniconda.html Depuis anaconda est grand, mettez miniconda L'utilisation est probablement la même Installez Python 3.7

VSCode Insérez le plug-in Python Pythoner est une charpie en mai, alors assurez-vous de le mettre Cela me met en colère contre PEP8 sans exception. Je ne sais pas ce qu'est PEP8

Syntaxe Python

Connaissance préalable

D'une manière ou d'une autre, ce que je sais des histoires des autres

Je sais seulement cela, mais je suis optimiste que cela deviendra en quelque sorte une atmosphère

Comparaison du cadre

Un aperçu des comparaisons des frameworks Web Python

Pyramid n'a pas beaucoup d'informations ...

https://hotframeworks.com/languages/python Classement du cadre

Dans le top 3 avec Django, Flask, Tornado Bottle, AIOHTTP, web.py, Pyramid, web2.py sont à peu près au même tarif

Pyramid a peu d'informations japonaises, il semble donc que vous deviez programmer avec des informations en anglais ...

Devinez en regardant le code Github

Choisissez un projet Python avec une étoile élevée et regardez le code Mon style habituel de recherche de fonctionnalités et de recherche de choses que je ne comprends pas

Dans l'enquête ci-dessus, il est nécessaire d'enquêter à nouveau autour du colis. J'ai pu comprendre le langage Python.

Commencer le développement

Création de projet

https://trypyramid.com/ https://docs.pylonsproject.org/projects/pyramid/en/latest/ La formule semble être au dessus

$ pip install pyramid
$ pcreate -s alchemy testapp
$ cd testapp
$ python setup.py develop
$ pserve development.ini

Je pourrais utiliser SQL Alchemy (peut-être ORM), j'ai donc ajouté l'option alchemy et créé un modèle de testapp. Démarrez le serveur avec les paramètres de development.ini et accédez à http: // localhost: 6543 Jusqu'à ce point

SQLAlchemy n'est pas défini, donc dans le navigateur

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.

Est affiché Il semble que vous deviez créer une base de données SQLite pour la faire fonctionner pour le moment

$ initialize_testapp_db development.ini

Il bougeait facilement

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

J'ai imaginé un désert jaune car il s'appelait Pyramid, mais la couleur de l'image semble être rouge

Je vais enquêter sur ce qui m'importe

pychache est fait arbitrairement, alors vérifiez-le

Il semble que Python le compile et le fabrique. Mettez-le dans .gitignore et supprimez-le du contrôle de code source

call Vous pouvez appeler une instance différente du constructeur avec ().

Est-ce l'opérateur () en C ++?

Je veux changer l'extension .jinja2 de vue.

Ajouté à la configuration init de la racine du projet

    config.add_jinja2_renderer(".html")

Séparateur de modèle

Dans jinja2, {{}} semble être le séparateur par défaut

block {% extends "layout.html" %} {% block content %} {% endblock content %} C'était un mystère au début, mais je l'ai découvert quand je l'ai exécuté en réécrivant le HTML dans ce jinja2 semble pouvoir hériter du modèle Basé sur layout.html. Il est spécifié dans extend Et réécrivez le bloc parent avec le bloc modèle enfant Il semble que vous créez une page comme celle-là

dynamic url Je ne sais pas si tu l'appelles comme ça {{request.static_url('testapp:static/pyramid.png')}} J'étais curieux de connaître cette partie. Probablement rendu à partir du framework au lieu d'écrire le chemin directement Je pense que c'est le chemin Nous étudierons les détails des paramètres plus tard. C'est un mystère d'entrer le nom de l'application D'autres instructions sont ci-dessous, vous pouvez donc utiliser quelque chose https://docs.pylonsproject.org/projects/pyramid/en/latest/api/request.html

routing Situé dans routes.py

def includeme(config):
    config.add_static_view('static', 'static', cache_max_age=3600)
    config.add_route('home', '/')

Tout d'abord, je suis curieux de m'inclure https://docs.pylonsproject.org/projects/pyramid/en/latest/api/config.html Je ne suis pas sûr, mais à première vue, s'il y a une fonction nommée includeeme, Pyramid l'appellera par défaut (le nom de la fonction peut être omis).

Le premier argument de config.add_route est le nom et le second argument est l'URL. Faire correspondre la vue avec le nom du premier argument

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'}

décorateur view_config. route_name correspond au nom de l'itinéraire précédent le rendu est un modèle à rendre Il existe d'autres requests_method, match_param, etc., et il semble que cela puisse être divisé en plusieurs cas. https://docs.pylonsproject.org/projects/pyramid/en/latest/narr/viewconfig.html

Le système normal renvoie une séquence associative contenant un et un projet. Devrait rendre la valeur à mytemplate.html. Frappé.

Probablement, si vous retournez Dictionary, il sera rendu avec le modèle Si vous le retournez avec Response etc., il sera rendu indépendamment sans utiliser de modèle

Remodeler et se souvenir

Ajouter une vue

Créer une nouvelle page en ajoutant un routage, une vue, un modèle

POST depuis le formulaire

Si j'utilisais la balise form, je pourrais simplement le faire avec HTML, mais il semble que je devrais utiliser la bibliothèque de formulaires Il semble que la pyramide utilise Deform https://docs.pylonsproject.org/projects/pyramid/en/latest/quick_tutorial/forms.html

Apparemment, il semble être utilisé avec plus froid Créer un schéma (classe) dérivé de l'objet passoire Il semble que la variable membre de cette classe = l'élément du formulaire Très pratique

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="")

En vue, créez une instance de ce schéma et créez un formulaire à partir du schéma Passez-le simplement à View Puisque c'est un gros problème, créez une classe en n'imitant que l'échantillon (Je ne connais pas du tout Python, mais ça ressemble à ça)

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}

Qu'est-ce que reify ... https://docs.pylonsproject.org/projects/pyramid/en/latest/api/decorator.html

Se comporte comme une propriété Python, mais enregistre la valeur sous forme de dictionnaire une fois appelée Je me demande quoi·· Les propriétés Python sont probablement comme les propriétés d'autres langages, comme C # Est-ce une fonction qui peut être appelée sans (), ou une fonction qui renvoie une valeur? Cependant, dans le cas de reify, il est appelé au premier appel, mais après cela, il semble renvoyer la même valeur Puisque la valeur peut être écrasée de l'extérieur, c'est une petite chose étrange différente d'une tonne unique

Dans le cas ci-dessus, formulaire de retour

Les paramètres publiés peuvent être obtenus avec request.params.get ("hoge")

Le modèle est

{{ rendered_form | safe }}

Ensuite, mettez simplement la variable de formulaire et le formulaire s'affichera. J'ai enquêté sur ce qu'est le coffre-fort, mais cela semble être une caractéristique de jinja2 Normalement, jinja2 semble échapper aux balises lors du rendu pour empêcher les attaques XSS Lorsque j'ai désactivé le coffre-fort, le code HTML échappé était affiché. Cependant, si vous ajoutez safe, vous pouvez écrire du HTML sans échapper.

Je n'ai pas encore validé le formulaire, mais le formulaire est très clair.

Effectuer la validation

https://docs.pylonsproject.org/projects/deform/en/latest/validation.html Même si j'écris le code comme indiqué ici, je ne sais pas si CSRFSchema ne peut pas être importé en premier lieu Il n'y a pas de passoire. J'ai réussi à écrire un tel code

En fait, puisque le validateur est défini dans Schema, vous pouvez le valider en l'appelant correctement.

Obtenez des contrôles pour faire la validation Je n'ai pas suivi en détail, mais je pense que c'est le contenu et la valeur du formulaire

Et si vous passez des contrôles pour valider l'objet de formulaire, le validateur sera vérifié Si NG, une exception ValidationFailure se produira

Cette fois, si vous rencontrez une exception, vous êtes redirigé vers /. Je veux connaître un meilleur moyen

        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 }

Jusqu'à ici pour cette fois. .. .. .. Continuez s'il y a de l'espoir

Taguer jusqu'au présent https://github.com/YukiMiyatake/YukiMiyatakeWorks/tree/pyramid_deform_validation

Recommended Posts

Soudain, j'avais besoin de travailler sur un projet utilisant Python et Pyramid, donc une note sur la façon dont j'étudie
J'ai essayé de créer un projet en utilisant Python sur Docker avec PyCharm, mais cela a fonctionné avec Docker Compose
Remarques sur la création d'un environnement LAMP à l'aide de Vagrant et VirtulBox
J'ai essayé de créer une expression régulière de "montant" en utilisant Python
[Python] J'ai essayé d'implémenter un tri stable, alors notez
J'ai essayé de créer une expression régulière de "temps" en utilisant Python
J'ai essayé de créer une expression régulière de "date" en utilisant Python
Comment créer un environnement Python à l'aide de Virtualenv sur Ubuntu 18.04 LTS
J'ai fait beaucoup de recherches sur la façon dont Python est exécuté
Comment faire coexister Python 3.x et 2.x sur Mac (j'ai également inclus opencv en bonus)
J'ai essayé de trouver la différence entre A + = B et A = A + B en Python, alors notez
[Fabric] J'étais accro à l'utilisation de booléen comme argument, alors notez les contre-mesures.
J'ai créé un exemple pour accéder à Salesforce en utilisant Python et Bottle
Je souhaite créer une application Web en utilisant React et Python flask
Mémorandum de travail (pymongo) Partie 3. Je ne veux pas le réexaminer, alors prenez-en note (agrégé)
[Circuit x Python] Comment trouver la fonction de transfert d'un circuit en utilisant Lcapy
Comment créer un environnement pour utiliser plusieurs versions de Python sur un Mac
J'ai fait un script pour enregistrer la fenêtre active en utilisant win32gui de Python
Notez que j'étais accro à la configuration de TensowFlow
Que faire lorsque matplotlib se fâche contre CentOS en disant "J'utilise Agg donc je ne peux pas émettre de chiffre"
J'ai essayé de notifier la mise à jour de "Devenir romancier" en utilisant "IFTTT" et "Devenir un romancier API"
Comment créer un bel environnement Python sur un nouveau Mac et installer Jupter Notebook
Je souhaite prendre une capture d'écran du site sur Docker en utilisant n'importe quelle police
Comment mettre Pyenv sur Amazon Linux et Ubuntu pour créer un environnement Python 3.6.0
Je suis habitué à php + twig, j'ai donc changé le moteur de template de pyramid 1.5 en jinja2.
Les débutants en Python ont créé un chat BOT alors j'ai essayé de résumer comment le faire
J'ai essayé de résumer comment utiliser matplotlib de python
Comment écrire un type liste / dictionnaire de Python3
Je suis tombé sur l'utilisation de MoviePy, alors prenez note
Comment créer un environnement Django (python) sur Docker
Je veux travailler avec un robot en python.
Comment créer un package Python à l'aide de VS Code
Comment exécuter une commande à l'aide d'un sous-processus en Python
J'ai essayé d'utiliser Python (3) au lieu d'un calculateur de fonctions
Comment créer un environnement Python sur Amazon Linux 2
Note Python: Le mystère de l'attribution d'une variable à une variable
Comment créer un environnement d'exécution virtuelle pour Python à l'aide de Visual Studio Code et de pipenv sur une machine Windows (également le notebook Jupyter)
Le traitement parallèle de Python joblib ne fonctionne pas dans l'environnement uWSGI. Comment traiter en parallèle sur uWSGI?
Comment démarrer un serveur WEB simple qui peut exécuter des cgi de php et python
Comment créer une instance d'une classe particulière à partir de dict en utilisant __new__ () en python
[Python] Comment supprimer des lignes et des colonnes dans une table (liste des options de méthode de dépôt)
Je souhaite créer une source sonore de karaoké en séparant les instruments et les voix en utilisant Python
Comment connaître le nombre de GPU de python ~ Remarques sur l'utilisation du multitraitement avec pytorch ~
J'ai créé une fonction pour découper l'image de python openCV, alors veuillez l'utiliser.
Comment dessiner facilement la structure d'un réseau de neurones sur Google Colaboratory à l'aide de "convnet-tiroir"
Je veux faire un changeur de voix en utilisant Python et SPTK en référence à un site célèbre
[Python] Comment créer une liste de chaînes de caractères caractère par caractère
Comment créer un nouvel environnement virtuel Python sur Ubuntu
[python] Résumé de la récupération des listes et des éléments du dictionnaire
Comment mélanger une partie de la liste Python (au hasard.shuffle)
Je veux démarrer beaucoup de processus à partir de python
[Python] Résumé de l'utilisation des fonctions de fractionnement et de jointure
J'ai essayé "Comment obtenir une méthode décorée en Python"
Comment développer dans un environnement virtuel Python [Memo]
Comparaison de l'utilisation des fonctions d'ordre supérieur dans Python 2 et 3
Comment enregistrer un package dans PyPI (à partir de septembre 2017)
Comment obtenir une liste d'exceptions intégrées pour python
Je veux connaître la nature de Python et pip
J'ai fait un chronomètre en utilisant tkinter avec python
Comment écrire une classe méta qui prend en charge à la fois python2 et python3
J'ai créé Chatbot en utilisant l'API LINE Messaging et Python