Creating a more comprehensive disaster response app would involve adding various functionalities
Creating a more comprehensive disaster response app would involve adding various functionalities
user authentication, a database for alerts and user information, and improved UI/UX. Below is a more
extensive example that spans around 10 pages of code, structured for clarity. We'll use Flask with
SQLAlchemy for the database and Flask-WTF for form handling.
```
disaster_response_app/
├── app.py
├── config.py
├── models.py
├── forms.py
├── templates/
│ ├── base.html
│ ├── index.html
│ ├── alerts.html
│ ├── add_alert.html
│ ├── register.html
│ ├── login.html
│ ├── profile.html
│ └── styles.css
├── static/
│ └── styles.css
└── requirements.txt
```
```bash
```
```bash
```
```plaintext
Flask
Flask-SQLAlchemy
Flask-WTF
Flask-Login
```
```python
import os
class Config:
SQLALCHEMY_TRACK_MODIFICATIONS = False
```
### Step 3: Models (`models.py`)
```python
db = SQLAlchemy(app)
id = db.Column(db.Integer, primary_key=True)
class Alert(db.Model):
id = db.Column(db.Integer, primary_key=True)
```
```python
class RegistrationForm(FlaskForm):
username = StringField('Username', validators=[DataRequired(), Length(min=2, max=150)])
class LoginForm(FlaskForm):
submit = SubmitField('Login')
class AlertForm(FlaskForm):
```
```python
app = Flask(__name__)
app.config.from_object(Config)
db.init_app(app)
login_manager = LoginManager(app)
login_manager.login_view = 'login'
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
@app.route('/')
def home():
return render_template('index.html')
@app.route('/alerts')
@login_required
def show_alerts():
alerts = Alert.query.all()
@login_required
def add_alert():
form = AlertForm()
if form.validate_on_submit():
db.session.add(new_alert)
db.session.commit()
return redirect(url_for('show_alerts'))
def register():
form = RegistrationForm()
if form.validate_on_submit():
db.session.add(new_user)
db.session.commit()
return redirect(url_for('login'))
def login():
form = LoginForm()
if form.validate_on_submit():
user = User.query.filter_by(username=form.username.data).first()
login_user(user)
return redirect(url_for('show_alerts'))
else:
@app.route('/profile')
@login_required
def profile():
@app.route('/logout')
@login_required
def logout():
logout_user()
return redirect(url_for('home'))
if __name__ == '__main__':
app.run(debug=True)
```
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
</head>
<body>
<header>
<nav>
{% if current_user.is_authenticated %}
{% else %}
<a href="{{ url_for('login') }}">Login</a>
{% endif %}
</nav>
</header>
<main>
{% if messages %}
<ul>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
</main>
<footer>
</footer>
</body>
</html>
```
**`templates/index.html`**
```html
{% extends "base.html" %}
{% block content %}
<h2>Welcome!</h2>
{% endblock %}
```
**`templates/alerts.html`**
```html
{% extends "base.html" %}
{% block content %}
<h2>Emergency Alerts</h2>
<ul>
{% endfor %}
</ul>
{% endblock %}
```
**`templates/add_alert.html`**
```html
{% extends "base.html" %}
{% block content %}
<h2>Add Emergency Alert</h2>
<form method="POST">
{{ form.hidden_tag() }}
<div>
{{ form.alert_type.label }}<br>
{{ form.alert_type(size=32) }}<br>
{% endfor %}
</div>
<div>
{{ form.message.label }}<br>
{{ form.message(rows=5) }}<br>
{% endfor %}
</div>
<div>
{{ form.submit() }}
</div>
</form>
{% endblock %}
```
**`templates/register.html`**
```html
{% extends "base.html" %}
{% block content %}
<h2>Register</h2>
<form method="POST">
{{ form.hidden_tag() }}
<div>
{{ form.username.label }}<br>
{{ form.username(size=32) }}<br>
{% endfor %}
</div>
<div>
{{ form.password.label }}<br>
{{ form.password(size=32) }}<