Last active
March 4, 2018 15:33
-
-
Save blohinn/9b84835c40b46375789c1efcce8ef435 to your computer and use it in GitHub Desktop.
В дополнение к презентации "Введение в API".
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from flask import Flask, request, jsonify | |
from flask_sqlalchemy import SQLAlchemy | |
import datetime | |
app = Flask(__name__) | |
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.db' | |
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True | |
db = SQLAlchemy(app) | |
class Note(db.Model): | |
id = db.Column(db.Integer, primary_key=True) | |
note_text = db.Column(db.String, nullable=False) | |
created = db.Column(db.DateTime, default=datetime.datetime.utcnow) | |
@property | |
def serialize(self): | |
return { | |
'id': self.id, | |
'note_text': self.note_text, | |
'created': self.created | |
} | |
@app.route('/notes/<int:id>', methods=['GET']) | |
def get_note(id): | |
"""Получить ОДНУ запись запись по ID""" | |
note = Note.query.get(id) | |
if not note: | |
return jsonify({'msg': 'Note not found. Did you send correct id?'}), 404 | |
return jsonify({'response': note.serialize}), 200 | |
@app.route('/notes', methods=['GET']) | |
def get_notes(): | |
"""Получить все записи""" | |
notes = Note.query.order_by(Note.created.desc()).all() | |
serialized_notes = [] | |
for note in notes: | |
serialized_notes.append(note.serialize) | |
return jsonify({'response': serialized_notes}), 200 | |
@app.route('/notes', methods=['POST']) | |
def create_note(): | |
try: | |
request_json = request.get_json(force=True) | |
except: | |
return jsonify({'msg': 'Send me correct application/json please :('}), 400 | |
if 'note_text' not in request_json: | |
return jsonify({'msg': 'Your JSON correct, but required param "note_text" is missed.'}), 400 | |
note = Note(note_text=request_json['note_text']) | |
db.session.add(note) | |
db.session.commit() | |
return jsonify(note.serialize), 200 | |
@app.route('/notes/<int:id>', methods=['PUT']) | |
def update_note(id): | |
try: | |
request_json = request.get_json(force=True) | |
except: | |
return jsonify({'msg': 'Send me correct application/json please :('}), 400 | |
if 'note_text' not in request_json: | |
return jsonify({'msg': 'Param "note_text" is missed'}), 400 | |
note = Note.query.get(id) | |
if not note: | |
return jsonify({'msg': 'Note not found. Did you send correct id?'}), 404 | |
note.note_text = request_json['note_text'] | |
db.session.add(note) | |
db.session.commit() | |
return jsonify({'response': note.serialize}), 200 | |
@app.route('/notes/<int:id>', methods=['DELETE']) | |
def delete_note(id): | |
note = Note.query.get(id) | |
if not note: | |
return jsonify({'msg': 'Note not found. Did you send correct id?'}), 404 | |
db.session.delete(note) | |
db.session.commit() | |
return jsonify({'msg': 'Resource deleted'}), 200 | |
# Ниже - пример работы с Basic Auth. | |
# Использовать ее - не круто и НИКОГДА не используйте ее без HTTPS. | |
# Лучше использовать токены, например - JWT. Но это уже другая история. | |
# Используйте Basic Auth очень аккуратно. | |
@app.route('/protected', methods=['GET']) | |
def show_protected_resource(): | |
def check_auth(): | |
test_login = 'root' | |
test_password = 'toor' | |
auth = request.authorization | |
return auth.username == test_login and auth.password == test_password | |
if not check_auth(): | |
return jsonify({'msg': 'Auth failed'}), 403 | |
return jsonify({'msg': 'I am protected resource. Hello, root!'}) | |
if __name__ == '__main__': | |
db.create_all() | |
app.run(debug=True) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment