This commit is contained in:
2019-11-14 11:03:19 +01:00
commit 855727cb0d
32 changed files with 1108 additions and 0 deletions

View File

View File

@@ -0,0 +1,22 @@
from sqlalchemy import func
from project import db
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String, nullable=False)
email = db.Column(db.String, nullable=False)
active = db.Column(db.Boolean, default=True, nullable=False)
created_date = db.Column(db.DateTime, default=func.now(), nullable=False)
def to_json(self):
return {
'id': self.id,
'username': self.username,
'email': self.email,
'active': self.active,
}

View File

@@ -0,0 +1,49 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Flask on Docker</title>
<meta name="description" content="">
<meta name="author" content="">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link href="//cdnjs.cloudflare.com/ajax/libs/bulma/0.7.4/css/bulma.min.css"
rel="stylesheet"
>
{% block css %}{% endblock %}
</head>
<body>
<div class="container">
<div class="column is-one-third">
<br>
<h1 class="title">All Users</h1>
<hr><br>
<form action="/" method="POST">
<div class="field">
<input
name="username" class="input" type="text"
placeholder="Enter a username" required>
</div>
<div class="field">
<input
name="email" class="input" type="email"
placeholder="Enter an email address" required>
</div>
<input
type="submit" class="button is-primary is-fullwidth" value="Submit">
</form>
<br>
<hr>
{% if users %}
<ol>
{% for user in users %}
<li>{{user.username}}</li>
{% endfor %}
</ol>
{% else %}
<p>No users!</p>
{% endif %}
</div>
</div>
{% block js %}{% endblock %}
</body>
</html>

View File

@@ -0,0 +1,89 @@
from flask import Blueprint, request, render_template
from flask_restful import Resource, Api
from sqlalchemy import exc
from project.api.models import User
from project import db
users_blueprint = Blueprint('users', __name__, template_folder='./templates')
api = Api(users_blueprint)
class UsersPing(Resource):
def get(self):
return {
'status': 'success',
'message': 'pong!'
}
class UsersList(Resource):
def get(self):
response_object = {'status': 'success',
'data': {
'users': [user.to_json()
for user in User.query.all()]
}}
return response_object, 200
def post(self):
post_data = request.get_json()
response_object = {
'status': 'fail',
'message': 'Invalid payload.',
}
if not post_data:
return response_object, 400
username = post_data.get('username')
email = post_data.get('email')
try:
user = User.query.filter_by(email=email).first()
if not user:
db.session.add(User(username=username, email=email))
db.session.commit()
response_object['status'] = 'success'
response_object['message'] = f'{email} was added!'
return response_object, 201
else:
response_object['message'] = 'Sorry. That email already exists.'
return response_object, 400
except exc.IntegrityError:
db.session.rollback()
return response_object, 400
class Users(Resource):
def get(self, user_id):
response_object = {'status': 'fail',
'message': 'User does not exist'}
try:
user = User.query.filter_by(id=int(user_id)).first()
if not user:
return response_object, 404
else:
response_object = {'status': 'success',
'data': {
'id': user.id,
'username': user.username,
'email': user.email,
'active': user.active,
}}
return response_object, 200
except ValueError:
return response_object, 404
@users_blueprint.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
username = request.form['username']
email = request.form['email']
db.session.add(User(username=username, email=email))
db.session.commit()
users = User.query.all()
return render_template('index.html', users=users)
api.add_resource(UsersPing, '/users/ping')
api.add_resource(UsersList, '/users')
api.add_resource(Users, '/users/<user_id>')