Advertisement
Guest User

Untitled

a guest
Mar 26th, 2018
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.11 KB | None | 0 0
  1. #!login/bin/python3
  2. import os
  3. from flask import Flask,jsonify, abort, make_response, request,g, url_for,render_template
  4. from flask_httpauth import HTTPBasicAuth
  5. from flask_restful import Api, Resource, reqparse, fields, marshal
  6. from flask_sqlalchemy import SQLAlchemy
  7. from passlib.apps import custom_app_context as pwd_context
  8. from itsdangerous import (TimedJSONWebSignatureSerializer
  9.                           as Serializer, BadSignature, SignatureExpired)
  10.  
  11. # init
  12. app = Flask(__name__)
  13. app.config['SECRET_KEY'] = 'power you can trust'
  14. app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.sqlite'
  15. app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
  16. api = Api(app)
  17.  
  18. # extentions
  19. db = SQLAlchemy(app)
  20. auth = HTTPBasicAuth()
  21.  
  22. class Job(db.Model):
  23.     __tablename__ = 'jobs'
  24.     jobid = db.Column(db.Integer, primary_key= True)
  25.     username = db.Column(db.String(32), index = True)
  26.     jobname = db.Column(db.String(128))
  27.     intime = db.Column(db.String(128))
  28.     incoords = db.Column(db.String(64))
  29.     outtime = db.Column(db.String(128))
  30.     outcoords = db.Column(db.String(64))
  31.  
  32. class User(db.Model):
  33.     __tablename__ = 'users'
  34.     id = db.Column(db.Integer, primary_key=True)
  35.     username = db.Column(db.String(32),index=True)
  36.     password_hash = db.Column(db.String(64))
  37.  
  38.     def hash_password(self, password):
  39.         self.password_hash = pwd_context.encrypt(password)
  40.  
  41.     def verify_password(self, password):
  42.         return pwd_context.verify(password, self.password_hash)
  43.  
  44.     def generate_auth_token(self, expiration=600):
  45.         s = Serializer(app.config['SECRET_KEY'], expires_in=expiration)
  46.         return s.dumps({'id': self.id})
  47.  
  48.     @staticmethod
  49.     def verify_auth_token(token):
  50.         s = Serializer(app.config['SECRET_KEY'])
  51.         try:
  52.             data = s.loads(token)
  53.         except SignatureExpired:
  54.             return None
  55.         except BadSignature:
  56.             return None
  57.         user = User.query.get(data['id'])
  58.         return user
  59.  
  60. @auth.verify_password
  61. def verify_password(username_or_token, password):
  62.     user = User.verify_auth_token(username_or_token)
  63.     if not user:
  64.         user = User.query.filter_by(username=username_or_token).first()
  65.         if not user or not user.verify_password(password):
  66.             return False
  67.     g.user = user
  68.     return True
  69.  
  70. @app.route('/clockin/api/users', methods=['POST'])
  71. def new_user():
  72.     username = request.json.get('username')
  73.     password = request.json.get('password')
  74.     if username is None or password is None:
  75.         abort(400)
  76.     if User.query.filter_by(username=username).first() is not None:
  77.         abort(400)
  78.     user = User(username=username)
  79.     user.hash_password(password)
  80.     db.session.add(user)
  81.     db.session.commit()
  82.     return (jsonify({'username':user.username}), 201,
  83.             {'Location': url_for('get_user', id=user.id, _external=True)})
  84.  
  85. @app.route('/clockin/api/users/<int:id>')
  86. def get_user(id):
  87.     user = User.query.get(id)
  88.     if not user:
  89.         abort(400)
  90.     return jsonify({'username': user.username})
  91.  
  92. @app.route('/clockin/api/token')
  93. @auth.login_required
  94. def get_auth_token():
  95.     token = g.user.generate_auth_token(600)
  96.     return jsonify({'token': token.decode('ascii'), 'duration': 600})
  97.  
  98. @app.route('/clockin/api/resources')
  99. @auth.login_required
  100. def get_resource():
  101.     return jsonify({'data':'Hello, %s!' % g.user.username})
  102.  
  103. job_fields = {
  104.     'jobname' : fields.String,
  105.     'username': fields.String,
  106.     'incoords' : fields.String,
  107.     'intime' : fields.String,
  108.     'outcoords' : fields.String,
  109.     'outtime' : fields.String,
  110.     'uri' : fields.Url('job')
  111. }
  112.  
  113. class JobListAPI(Resource):
  114.     decorators = [auth.login_required]
  115.     def __init__(self):
  116.         self.reqparse = reqparse.RequestParser()
  117.         self.reqparse.add_argument('jobname', type = str, required = True,
  118.             help= 'No job name provided', location = 'json')
  119.         self.reqparse.add_argument('intime', type = str, required = True,
  120.             help= 'No start time provided', location = 'json')
  121.         self.reqparse.add_argument('incoords', type = str, default = "", location = 'json')
  122.         super(JobListAPI, self).__init__()
  123.  
  124.     def get(self):
  125.         return {'jobs' : [marshal(job, job_fields) for job in jobs]}
  126.  
  127.     def post(self):
  128.         args = self.reqparse.parse_args()
  129.         job = {
  130.             'id': jobs[-1]['id'] + 1,
  131.             'jobname' : args['jobname'],
  132.             'incoords':args['incoords'],
  133.             'intime':args['intime']
  134.         }
  135.         jobs.append(job)
  136.         return {'job':marshal(job,job_fields)} ,201
  137.  
  138. class JobAPI(Resource):
  139.     decorators = [auth.login_required]
  140.     def __init__(self):
  141.         self.reqparse = reqparse.RequestParser()
  142.         self.reqparse.add_argument('jobname', type = str, location='json')
  143.         self.reqparse.add_argument('incoords', type = str, location='json')
  144.         self.reqparse.add_argument('outtime', type = str, required = True, location='json')
  145.         self.reqparse.add_argument('outcoords', type = str, default = "", location ='json')
  146.         super(JobAPI, self).__init__()
  147.  
  148.     def get(self, id):
  149.         job = [job for job in jobs if job['id'] == id]
  150.         if len(job) == 0:
  151.             abort(404)
  152.         return ['job', marshal(job[0], job_fields)]
  153.  
  154.     def put(self,id):
  155.         job = [job for job in jobs if job['id'] == id]
  156.         if len(job) == 0:
  157.             abort(404)
  158.         job = job[0]
  159.         args = self.reqparse.parse_args()
  160.         for k, v in args.items():
  161.             if v is not None:
  162.                 job[k] = v
  163.         return {'job' : marshal(job,job_fields)}
  164.  
  165.     def delete(self,id):
  166.         pass
  167.  
  168. api.add_resource(JobListAPI, '/clockin/api/jobs', endpoint = 'jobs')
  169. api.add_resource(JobAPI, '/clockin/api/jobs/<int:id>', endpoint = 'job')
  170.  
  171. jobs = [{'id':1}]
  172.  
  173. @app.route('/')
  174. def index():
  175.     return render_template('index.html')
  176.  
  177. @auth.error_handler
  178. def unauthorized():
  179.     return make_response(jsonify({'error':'Unauthorized Access'}),401)
  180.  
  181. if __name__ =='__main__':
  182.     if not os.path.exists('db.sqlite'):
  183.         db.create_all()
  184.     app.run(debug=True)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement