From 666da3f35d5f9954a17050586a4810440a679bac Mon Sep 17 00:00:00 2001 From: Santo Cariotti Date: Fri, 10 Apr 2020 11:28:11 +0200 Subject: docs: new readme file --- README.md | 145 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 144 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 18e1076..4dc2dc2 100644 --- a/README.md +++ b/README.md @@ -1 +1,144 @@ -# frest \ No newline at end of file +# frest +How to create a REST API very quickly. + +## Installation +Install **frest** by pip package (you must have Python>=3.6). In this example I'm using [virtualev](https://pypi.org/project/virtualenv/), a tool for virtual environment creation. +``` +$ virtualenv env +$ source env/bin/activate +(env) $ pip install frest +``` + +## Use +#### Create a project +``` +(env) $ frest --init project + + __ _ + / _| | | + | |_ _ __ ___ ___| |_ + | _| '__/ _ \/ __| __| + | | | | | __/\__ \ |_ + |_| |_| \___||___/\__| + + + +Create project/... OK +Create project/__init__.py... OK + +``` +It will create a project tree folder like this one: +* database.py + A file with DATABASE_URI, database path, default is `sqlite:///database.db`. +* mail.py + A file with mail configuration: server, port, password etc. +* app.py + A file with routes and mail/database configuration. +* wsgi.py + File used for production. + +#### Create first app +Inside `project` folder, we start to create a new app. For example, we want to store books inside our database. +``` +(env) $ cd project/ +(env) $ pip --startapp book +``` + +It will print something like this: +``` + __ _ + / _| | | + | |_ _ __ ___ ___| |_ + | _| '__/ _ \/ __| __| + | | | | | __/\__ \ |_ + |_| |_| \___||___/\__| + + + +Create scheme/... OK +Create scheme/book... OK +Create scheme/book/__init__.py... OK +Create model for book... +Fields id, created_at, updated_at are default on every new model, you can delete it from model file + +Create field? (Y/n): +``` +Now we have to define a model for our `book`, using 6 data types: integer, string, text, datetime, float, bool. +This is an example of our `book` with **name** and **pubblication date**: +``` +Choose field name: name +Choose field type: int, str, text, datetime, float, bool str +Choose string size: 20 +Field is nullable? (Y/n): n +Create new field? (Y/n): +Choose field name: pubblication_date +Choose field type: int, str, text, datetime, float, bool datetime +Field is nullable? (Y/n): n +Create new field? (Y/n): n +Create scheme/book/models.py... OK +Create scheme/book/forms.py... OK +Create scheme/book/routes.py... OK +``` + +Now, our book it will be inside `scheme/book`. + +#### Move scheme routes inside app +Edit `project/app.py` and put your routes inside. +``` +[...] +from frest.auth.routes import api as api_users +from scheme.book.routes import api as api_books +[...] +app.register_blueprint(api_books) +[...] +``` + +#### Database creation +Open python interpreter, import db and create. +``` +from app import db +db.create_all() +``` +Now exit and check your scheme inside database. It will be something like this. +``` +CREATE TABLE user ( + "userId" INTEGER NOT NULL, + email VARCHAR(30), + password VARCHAR(30), + is_admin BOOLEAN, + name VARCHAR(30), + created_at DATETIME, + PRIMARY KEY ("userId"), + CHECK (is_admin IN (0, 1)) +); +CREATE TABLE book ( + "bookId" INTEGER NOT NULL, + name VARCHAR(20) NOT NULL, + pubblication_date DATETIME NOT NULL, + created_at DATETIME, + updated_at DATETIME, + PRIMARY KEY ("bookId") +); +CREATE TABLE token ( + "tokenId" INTEGER NOT NULL, + string VARCHAR(20), + created_at DATETIME, + expired BOOLEAN, + user_id INTEGER NOT NULL, + PRIMARY KEY ("tokenId"), + CHECK (expired IN (0, 1)), + FOREIGN KEY(user_id) REFERENCES user ("userId") +); +``` + +#### Start app +Inside `project` file you have to run `python app.py` and it's done. + +## TODO + + - [ ] Migrations of database in case of edits + - [ ] Put automatically `routes` inside app file + - [ ] More datatype + - [ ] Relantionships (1-to-1, 1-to-n, n-to-n) + + -- cgit v1.2.3-18-g5258