Editing: flaskCrud


flaskCrud

Flask>=2.0
Flask-SQLAlchemy>=3.0
Flask-Migrate>=4.0
pyodbc>=4.0
# pip install -r requirements.txt


from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(100), nullable=False)
    email = db.Column(db.String(100), nullable=False)

with app.app_context():
    db.create_all()
    print("Tables created!")



from flask import Flask, render_template_string, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

app = Flask(__name__)

# SQLite local DB file
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)
migrate = Migrate(app, db)

# User model
class User(db.Model):
    __tablename__ = 'users'

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(100), nullable=False)
    email = db.Column(db.String(100), nullable=False)

# Bootstrap CSS link
bootstrap_css = '''
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
'''

INDEX_TEMPLATE = bootstrap_css + '''
<div class="container mt-4">
    <h2>User Management (Flask-Migrate + ORM)</h2>
    <hr>
    <h4>Add User</h4>
    <form method="POST" action="{{ url_for('add_user') }}">
      <div class="mb-3">
        <input type="text" class="form-control" name="username" placeholder="Username" required>
      </div>
      <div class="mb-3">
        <input type="email" class="form-control" name="email" placeholder="Email" required>
      </div>
      <button type="submit" class="btn btn-primary">Add User</button>
    </form>

    <hr>
    <h4>Users List</h4>
    <table class="table table-striped">
      <thead>
        <tr><th>ID</th><th>Username</th><th>Email</th><th>Actions</th></tr>
      </thead>
      <tbody>
        {% for user in users %}
        <tr>
          <td>{{ user.id }}</td>
          <td>{{ user.username }}</td>
          <td>{{ user.email }}</td>
          <td>
            <a href="{{ url_for('edit_user', user_id=user.id) }}" class="btn btn-sm btn-warning">Edit</a>
            <a href="{{ url_for('delete_user', user_id=user.id) }}" class="btn btn-sm btn-danger" onclick="return confirm('Delete this user?')">Delete</a>
          </td>
        </tr>
        {% else %}
        <tr><td colspan="4">No users found.</td></tr>
        {% endfor %}
      </tbody>
    </table>
</div>
'''

EDIT_TEMPLATE = bootstrap_css + '''
<div class="container mt-4">
    <h2>Edit User</h2>
    <hr>
    <form method="POST" action="{{ url_for('edit_user', user_id=user.id) }}">
      <div class="mb-3">
        <input type="text" class="form-control" name="username" value="{{ user.username }}" required>
      </div>
      <div class="mb-3">
        <input type="email" class="form-control" name="email" value="{{ user.email }}" required>
      </div>
      <button type="submit" class="btn btn-success">Update User</button>
      <a href="{{ url_for('index') }}" class="btn btn-secondary">Cancel</a>
    </form>
</div>
'''

@app.route('/')
def index():
    users = User.query.all()
    return render_template_string(INDEX_TEMPLATE, users=users)

@app.route('/add', methods=['POST'])
def add_user():
    username = request.form['username']
    email = request.form['email']
    new_user = User(username=username, email=email)
    db.session.add(new_user)
    db.session.commit()
    return redirect(url_for('index'))

@app.route('/edit/<int:user_id>', methods=['GET', 'POST'])
def edit_user(user_id):
    user = User.query.get_or_404(user_id)
    if request.method == 'POST':
        user.username = request.form['username']
        user.email = request.form['email']
        db.session.commit()
        return redirect(url_for('index'))
    return render_template_string(EDIT_TEMPLATE, user=user)

@app.route('/delete/<int:user_id>')
def delete_user(user_id):
    user = User.query.get_or_404(user_id)
    db.session.delete(user)
    db.session.commit()
    return redirect(url_for('index'))



app.run(debug=True, host='0.0.0.0', port=8080)