emmett-framework / emmett

The web framework for inventors
Other
1.03k stars 70 forks source link

Bloggy example #384

Closed bamarob closed 2 years ago

bamarob commented 2 years ago

I'm trying to get through the Bloggy example and think I will enjoy Emmett once I get familiar with it. However, I keep hitting this issue...

Here's the current contents of my app.py file:

from emmett import App app = App(__name__) from emmett import session, now from emmett.orm import Model, Field, belongs_to, has_many from emmett.tools.auth import AuthUser class User(AuthUser): # will create "users" table and groups/permissions ones has_many('posts', 'comments') class Post(Model): belongs_to('user') has_many('comments') title = Field() text = Field.text() date = Field.datetime() default_values = { 'user': lambda: session.auth.user.id, 'date': lambda: now } validation = { 'title': {'presence': True}, 'text': {'presence': True} } fields_rw = { 'user': False, 'date': False } class Comment(Model): belongs_to('user', 'post') text = Field.text() date = Field.datetime() default_values = { 'user': lambda: session.auth.user.id, 'date': lambda: now } validation = { 'text': {'presence': True} } fields_rw = { 'user': False, 'post': False, 'date': False } app.config.auth.single_template = True app.config.auth.registration_verification = False app.config.auth.hmac_key = "july.10.1969" from emmett.orm import Database from emmett.tools import Auth db = Database(app) auth = Auth(app, db, user_model=User) db.define_models(Post, Comment) @app.command('setup') def setup(): # create the user user = User.create( email="bamarob55@gmail.com", first_name="Robert", last_name="Aldridge", password="superuser1" ) # create an admin group admins = auth.create_group("admin") # add user to admins group auth.add_membership(admins, user.id) db.commit() And, here's what I've done. You can see thing go quite well until I try to execute the 'setup' function... raldridge@mx:~$ mkdir -p bloggy raldridge@mx:~$ cd bloggy/ raldridge@mx:~/bloggy$ python -m venv .venv raldridge@mx:~/bloggy$ source .venv/bin/activate (.venv) raldridge@mx:~/bloggy$ pip install -U pip Cache entry deserialization failed, entry ignored Collecting pip Using cached https://files.pythonhosted.org/packages/ca/31/b88ef447d595963c01060998cb329251648acf4a067721b0452c45527eb8/pip-21.2.4-py3-none-any.whl Installing collected packages: pip Found existing installation: pip 18.1 Uninstalling pip-18.1: Successfully uninstalled pip-18.1 Successfully installed pip-21.2.4 (.venv) raldridge@mx:~/bloggy$ pip install emmett Collecting emmett Using cached Emmett-2.3.1-py3-none-any.whl (438 kB) Collecting websockets<10.0,>=9.1 Using cached websockets-9.1-cp37-cp37m-manylinux2010_x86_64.whl (103 kB) Collecting pyaes<1.7.0,>=1.6.1 Using cached pyaes-1.6.1-py3-none-any.whl Collecting uvicorn==0.14.0 Using cached uvicorn-0.14.0-py3-none-any.whl (50 kB) Collecting uvloop<0.16.0,>=0.15.3 Using cached uvloop-0.15.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (3.8 MB) Collecting renoir<2.0,>=1.3 Using cached Renoir-1.4.0-py3-none-any.whl (29 kB) Collecting click>=6.0 Using cached click-8.0.1-py3-none-any.whl (97 kB) Collecting h2<4.1.0,>=3.2.0 Using cached h2-4.0.0-py3-none-any.whl (57 kB) Collecting pyyaml<6.0,>=5.4 Using cached PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl (636 kB) Collecting pyDAL==17.3 Using cached pyDAL-17.3-py2.py3-none-any.whl (169 kB) Collecting severus<2.0,>=1.1 Using cached Severus-1.1.1-py3-none-any.whl (12 kB) Collecting python-rapidjson<2.0,>=1.0 Using cached python_rapidjson-1.4-cp37-cp37m-manylinux2010_x86_64.whl (1.4 MB) Collecting httptools<0.3.0,>=0.2.0 Using cached httptools-0.2.0-cp37-cp37m-manylinux1_x86_64.whl (344 kB) Collecting pendulum<2.2.0,>=2.1.2 Using cached pendulum-2.1.2-cp37-cp37m-manylinux1_x86_64.whl (155 kB) Collecting h11<0.11.0,>=0.10.0 Using cached h11-0.10.0-py2.py3-none-any.whl (53 kB) Collecting typing-extensions Using cached typing_extensions-3.10.0.2-py3-none-any.whl (26 kB) Collecting asgiref>=3.3.4 Using cached asgiref-3.4.1-py3-none-any.whl (25 kB) Collecting importlib-metadata Using cached importlib_metadata-4.8.1-py3-none-any.whl (17 kB) Collecting hpack<5,>=4.0 Using cached hpack-4.0.0-py3-none-any.whl (32 kB) Collecting hyperframe<7,>=6.0 Using cached hyperframe-6.0.1-py3-none-any.whl (12 kB) Collecting python-dateutil<3.0,>=2.6 Using cached python_dateutil-2.8.2-py2.py3-none-any.whl (247 kB) Collecting pytzdata>=2020.1 Using cached pytzdata-2020.1-py2.py3-none-any.whl (489 kB) Collecting six>=1.5 Using cached six-1.16.0-py2.py3-none-any.whl (11 kB) Collecting zipp>=0.5 Using cached zipp-3.5.0-py3-none-any.whl (5.7 kB) Installing collected packages: zipp, typing-extensions, six, importlib-metadata, pyyaml, pytzdata, python-dateutil, hyperframe, hpack, h11, click, asgiref, websockets, uvloop, uvicorn, severus, renoir, python-rapidjson, pyDAL, pyaes, pendulum, httptools, h2, emmett Successfully installed asgiref-3.4.1 click-8.0.1 emmett-2.3.1 h11-0.10.0 h2-4.0.0 hpack-4.0.0 httptools-0.2.0 hyperframe-6.0.1 importlib-metadata-4.8.1 pendulum-2.1.2 pyDAL-17.3 pyaes-1.6.1 python-dateutil-2.8.2 python-rapidjson-1.4 pytzdata-2020.1 pyyaml-5.4.1 renoir-1.4.0 severus-1.1.1 six-1.16.0 typing-extensions-3.10.0.2 uvicorn-0.14.0 uvloop-0.15.3 websockets-9.1 zipp-3.5.0 (.venv) raldridge@mx:~/bloggy$ ls (.venv) raldridge@mx:~/bloggy$ mdir static Can't open /dev/fd0: No such file or directory Cannot initialize 'A:' (.venv) raldridge@mx:~/bloggy$ mkdir static (.venv) raldridge@mx:~/bloggy$ mkdir templates (.venv) raldridge@mx:~/bloggy$ vim app.py (.venv) raldridge@mx:~/bloggy$ emmett develop > Starting Emmett development server on app app > Emmett application app running on http://127.0.0.1:8000 (press CTRL+C to quit) > Restarting (stat mode) INFO: Started server process [12509] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ^CINFO: Shutting down INFO: Waiting for application shutdown. INFO: Application shutdown complete. INFO: Finished server process [12509] (.venv) raldridge@mx:~/bloggy$ vim app.py (.venv) raldridge@mx:~/bloggy$ emmett migrations generate -m "First migration" > Generated migration for revision 073d42155969 (.venv) raldridge@mx:~/bloggy$ mkdir -p databases (.venv) raldridge@mx:~/bloggy$ emmett migrations up > Performing upgrades against sqlite://dummy.db > Performing upgrade: -> 073d42155969 (head), First migration > Adding revision 073d42155969 to schema > Succesfully upgraded to revision 073d42155969: First migration (.venv) raldridge@mx:~/bloggy$ !vim vim app.py (.venv) raldridge@mx:~/bloggy$ emmett setup Traceback (most recent call last): File "/home/raldridge/bloggy/.venv/bin/emmett", line 8, in sys.exit(main()) File "/home/raldridge/bloggy/.venv/lib/python3.7/site-packages/emmett/cli.py", line 521, in main cli.main(prog_name="python -m emmett" if as_module else None) File "/home/raldridge/bloggy/.venv/lib/python3.7/site-packages/emmett/cli.py", line 239, in main return super().main(*args, **kwargs) File "/home/raldridge/bloggy/.venv/lib/python3.7/site-packages/click/core.py", line 1062, in main rv = self.invoke(ctx) File "/home/raldridge/bloggy/.venv/lib/python3.7/site-packages/click/core.py", line 1668, in invoke return _process_result(sub_ctx.command.invoke(sub_ctx)) File "/home/raldridge/bloggy/.venv/lib/python3.7/site-packages/click/core.py", line 1404, in invoke return ctx.invoke(self.callback, **ctx.params) File "/home/raldridge/bloggy/.venv/lib/python3.7/site-packages/click/core.py", line 763, in invoke return __callback(*args, **kwargs) File "/home/raldridge/bloggy/app.py", line 71, in setup password="superuser1" File "/home/raldridge/bloggy/.venv/lib/python3.7/site-packages/emmett/orm/models.py", line 582, in create return cls.table.validate_and_insert(**kwargs) File "/home/raldridge/bloggy/.venv/lib/python3.7/site-packages/pydal/objects.py", line 757, in validate_and_insert response, new_fields = self._validate_fields(fields) File "/home/raldridge/bloggy/.venv/lib/python3.7/site-packages/pydal/objects.py", line 749, in _validate_fields value, error = self[fieldname].validate(raw_value) File "/home/raldridge/bloggy/.venv/lib/python3.7/site-packages/pydal/objects.py", line 1811, in validate (value, error) = validator(value) File "/home/raldridge/bloggy/.venv/lib/python3.7/site-packages/emmett/validators/inside.py", line 235, in __call__ ).select(limitby=(0, 1)).first() File "/home/raldridge/bloggy/.venv/lib/python3.7/site-packages/emmett/orm/objects.py", line 334, in select return obj._run_select_(*fields, **options) File "/home/raldridge/bloggy/.venv/lib/python3.7/site-packages/emmett/orm/objects.py", line 318, in _run_select_ return super(Set, self).select(*fields, **options) File "/home/raldridge/bloggy/.venv/lib/python3.7/site-packages/pydal/objects.py", line 2210, in select return adapter.select(self.query, fields, attributes) File "/home/raldridge/bloggy/.venv/lib/python3.7/site-packages/pydal/adapters/sqlite.py", line 82, in select return super(SQLite, self).select(query, fields, attributes) File "/home/raldridge/bloggy/.venv/lib/python3.7/site-packages/pydal/adapters/base.py", line 760, in select return self._select_aux(sql, fields, attributes, colnames) File "/home/raldridge/bloggy/.venv/lib/python3.7/site-packages/pydal/adapters/base.py", line 716, in _select_aux rows = self._select_aux_execute(sql) File "/home/raldridge/bloggy/.venv/lib/python3.7/site-packages/pydal/adapters/base.py", line 710, in _select_aux_execute self.execute(sql) File "/home/raldridge/bloggy/.venv/lib/python3.7/site-packages/pydal/adapters/__init__.py", line 65, in wrap raise ValueError(args[1]) ValueError: SELECT "users"."id", "users"."created_at", "users"."updated_at", "users"."email", "users"."password", "users"."registration_key", "users"."reset_password_key", "users"."registration_id", "users"."first_name", "users"."last_name" FROM "users" WHERE (("users"."id" IS NOT NULL) AND ("users"."email" = 'bamarob55@gmail.com')) ORDER BY "users"."id" LIMIT 1 OFFSET 0;
gi0baro commented 2 years ago

@bamarob the documentation lacks a line you can find in the examples folder, you need to put the code of your setup method within a connection context:

def setup():
    with db.connection():
        # your code

I'll fix the documentation.