Binding multiple databases |
---|
Key Point: Make sure both the database model and the database file you're trying to create matches names. For example,
class ExampleData(db.Model): id = db.Column(db.Integer, primary_key=True) content = db.Column(db.String(500)) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///something.db' app.config['SQLALCHEMY_BINDS'] = { 'example_data': 'sqlite:///example.db', }
Then, when working on the data in Python, you can create the database table via:
db.create_all(bind_key="quick_references_data") |
CK Editor Setup |
---|
Ensure: You've configured a secret key from flask_ckeditor import CKEditor ckeditor = CKEditor(app)
Set the field in your forms.py class ExampleForm(FlaskForm): name = StringField("name") content = CKEditorField("content")
HTML Example: <section class="flex justify-center"> <form method="post" class="flex flex-col items-center gap-2"> {{ form.csrf_token }} ... {{form.submit}} </form> </section> {{ ckeditor.load() }} {{ ckeditor.config(name='answer') }} |
Configuring a secret key |
---|
import os app.config['SECRET_KEY'] = os.urandom(24) |
Creating requirements.txt |
---|
pip freeze > requirements.txt |
Database migration |
---|
set FLASK_APP=app_name.py flask db init # Run if you haven't initialized migrations flask db migrate # Generates the migration scripts flask db upgrade # Finalizes data migration |
Flask Admin Setup |
---|
Assuming everything is set up:
from flask_admin import Admin from flask_admin.contrib.sqla import ModelView admin = Admin() if __name__ == '__main__': admin.init_app(app)
In your models.py admin.add_view(ModelView(ExampleData, db.session))
Then, navigate to |
Flask Login Setup |
---|
Checklist
pip install flask-login flask-bcrypt
1. import LoginManager and Bcrypt, initialize them both. from flask_login import LoginManager from flask_bcrypt import Bcrypt
2. Include a user loader with the data models. from flask_template import db, admin, login_manager from flask_login import UserMixin
@login_manager.user_loader def load_user(user_id): return UsersData.query.filter_by(id=user_id).first()
3. Set up login/registration/logout routes and validate the forms. from flask_login import login_user, logout_user, current_user ... bcrypt.generate_password_hash bcrypt.check_password_hash
4. Set routes to be required to be logged in via: @login_required |
Forms.py Setup |
---|
from wtforms import StringField, SubmitField from flask_ckeditor import CKEditorField from flask_wtf import FlaskForm
class ExampleForm(FlaskForm): title = StringField('Title') content = CKEditorField('Content') submit = SubmitField('Submit')
HTML:
<form method="post" class="flex flex-col items-center gap-2"> {{ form.csrf_token }} {{ form.title.label }} <p>{{ form.title }}</p> {{ form.content.label }} <p>{{ form.content }}</p> {{form.submit}} </form>
Routes.py: crud = Blueprint('crud',__name__) @crud.route("/crud_operations", methods=['GET', 'POST']) def crud_db(): datas = ExampleData.query.all() form = ExampleForm() if form.validate_on_submit(): # Create a new UI_Library entry new_entry = ExampleData( title=form.title.data, content=form.content.data, ) # Add and commit to the database db.session.add(new_entry) db.session.commit() return redirect(url_for("crud.crud_db")) return render_template('crud.html', datas = datas, form = form) |
Setting a jinja variable's class |
---|
{{ form.password(class_="border rounded-md") }} |
url_for() |
---|
CSS<link href="{{ url_for('static', filename='css/output.css') }}" rel="stylesheet">
CSS File: Can’t use jinja in a CSS file. Needs a path. body { background-image: url('../static/f.png'); }
Favicon<link rel="icon" type="image/x-icon" href="{{ url_for('static', filename='images/coding.png') }}">
JavaScript<script src="{{ url_for('static', filename='js/jquery.js') }}"></script>
Passing to JavaScript<small onclick="doSomething( {{ button.id }} )" class="hover:cursor-pointer">Do Something</small>
Note: Use back ticks to prevent issues with onclick="addLayout( `{{layout.code | safe }}` )"
Route Function Name<a href="{{ url_for('html_resources.index', page=1) }}" class="nav-link">Resources</a> |