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
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
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
Un aperçu des comparaisons des frameworks Web Python
Django Cadre de pile complète Beaucoup d'informations sur le Web Premier choix dans le cadre Web Python
Bottle WSGI Cadre léger
Flask WSGI Cadre léger
Tornado E / S non bloquantes
Plone
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 ...
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
def
et se terminent par:. Déclaration de prototype de style C. Aucune valeur de retour ou type spécifié" ""
~ "" "
. Apparemment, l'indentation est importante. Il semble que les guillemets triples ne soient pas des commentaires, mais des chaînes de caractères littérales!* arg
semble être un argument de longueur variable sans mots-clés** kwargs
semble être un argument de longueur variable avec des mots-clésclass
, et il semble qu'elle puisse être utilisée principalement comme orientée objet.__init__
semble agir comme un constructeurclasse
avec nom de classe ()
@ xxx
devant la fonction pour changer le comportement de la fonction. Appelé un décorateur@ classmethod
, qui peut littéralement spécifier une fonction comme méthode de classe.__Init __. Py
Difficile. Initialisez le package, etc. Si vous ne créez pas de fichier vide, il ne se chargera pas normalement. Creusons profondément dans le futurDans l'enquête ci-dessus, il est nécessaire d'enquêter à nouveau autour du colis. J'ai pu comprendre le langage Python.
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
J'ai imaginé un désert jaune car il s'appelait Pyramid, mais la couleur de l'image semble être rouge
Il semble que Python le compile et le fabrique. Mettez-le dans .gitignore et supprimez-le du contrôle de code source
Est-ce l'opérateur () en C ++?
Ajouté à la configuration init de la racine du projet
config.add_jinja2_renderer(".html")
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
Créer une nouvelle page en ajoutant un routage, une vue, un modèle
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.
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