From b0cb34e8e4ddf09b0cfe3081439610c6f6d0341c Mon Sep 17 00:00:00 2001 From: Zachary Sloan Date: Fri, 22 Mar 2013 22:40:57 +0000 Subject: Added secure_server.py Updated notes.txt --- wqflask/secure_server.py | 76 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 wqflask/secure_server.py (limited to 'wqflask/secure_server.py') diff --git a/wqflask/secure_server.py b/wqflask/secure_server.py new file mode 100644 index 00000000..49e0b433 --- /dev/null +++ b/wqflask/secure_server.py @@ -0,0 +1,76 @@ +from __future__ import print_function, division, absolute_import + +from wqflask import app + +from flask import Flask, render_template +from flask.ext.sqlalchemy import SQLAlchemy +from flask.ext.security import Security, SQLAlchemyUserDatastore, \ + UserMixin, RoleMixin + +# Create app +#app = Flask(__name__) +app.config['SECRET_KEY'] = 'LjfrbDOlvdFMT5cCi9qrJqStxK4NcmxW' +app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://webqtl:f2ZypIflRM@gn.cazhbciu2y1i.us-east-1.rds.amazonaws.com/db_webqtl' +#app.config['SECURITY_CONFIRMABLE'] = True +app.config['SECURITY_TRACKABLE'] = True + +# Create database connection object +db = SQLAlchemy(app) + +# Define models +roles_users = db.Table('roles_users', + db.Column('user_id', db.Integer(), db.ForeignKey('user.id')), + db.Column('role_id', db.Integer(), db.ForeignKey('role.id'))) + +class Role(db.Model, RoleMixin): + id = db.Column(db.Integer(), primary_key=True) + name = db.Column(db.String(80), unique=True) + description = db.Column(db.String(255)) + +class User(db.Model, UserMixin): + id = db.Column(db.Integer(), primary_key=True) + email = db.Column(db.String(255), unique=True) + password = db.Column(db.String(255)) + active = db.Column(db.Boolean()) + confirmed_at = db.Column(db.DateTime()) + + last_login_at = db.Column(db.DateTime()) + current_login_at = db.Column(db.DateTime()) + last_login_ip_= db.Column(db.String(39)) + current_login_ip = db.Column(db.String(39)) + login_count = db.Column(db.Integer()) + + roles = db.relationship('Role', secondary=roles_users, + backref=db.backref('users', lazy='dynamic')) + +# Setup Flask-Security +user_datastore = SQLAlchemyUserDatastore(db, User, Role) +security = Security(app, user_datastore) + +# Create a user to test with +#@app.before_first_request +def create_user(): + db.create_all() + user_datastore.create_user(email='matt@example.com', password='notebook') + db.session.commit() + +## Views +#@app.route('/') +#def home(): +# return render_template('index.html') + +import logging +#from themodule import TheHandlerYouWant +file_handler = logging.FileHandler("/tmp/flask_gn_log") +file_handler.setLevel(logging.DEBUG) +app.logger.addHandler(file_handler) + +import logging_tree +logging_tree.printout() + +if __name__ == '__main__': + #create_user() + app.run(host='0.0.0.0', + use_debugger=False, + threaded=True, + use_reloader=True) -- cgit v1.2.3 From 05f4cfc55a6473cb438ce0059d6d37f913abcb01 Mon Sep 17 00:00:00 2001 From: Zachary Sloan Date: Fri, 22 Mar 2013 23:29:55 +0000 Subject: Began creating templates for login/registration --- wqflask/cfg/default_settings.py | 7 +++- wqflask/secure_server.py | 24 +++--------- wqflask/wqflask/templates/security/_macros.html | 16 ++++++++ wqflask/wqflask/templates/security/_menu.html | 15 ++++++++ wqflask/wqflask/templates/security/_messages.html | 9 +++++ .../wqflask/templates/security/register_user.html | 45 ++++++++++++++++++++++ 6 files changed, 96 insertions(+), 20 deletions(-) create mode 100644 wqflask/wqflask/templates/security/_macros.html create mode 100644 wqflask/wqflask/templates/security/_menu.html create mode 100644 wqflask/wqflask/templates/security/_messages.html create mode 100644 wqflask/wqflask/templates/security/register_user.html (limited to 'wqflask/secure_server.py') diff --git a/wqflask/cfg/default_settings.py b/wqflask/cfg/default_settings.py index 53b5a96e..a575a3bd 100644 --- a/wqflask/cfg/default_settings.py +++ b/wqflask/cfg/default_settings.py @@ -4,5 +4,8 @@ LOGFILE = """/tmp/flask_gn_log""" #400 bad request response with no exception/log TRAP_BAD_REQUEST_ERRORS = True -#SECURITY_CONFIRMABLE = True -SECURITY_TRACKABLE = True \ No newline at end of file +# http://pythonhosted.org/Flask-Security/configuration.html +SECURITY_CONFIRMABLE = True +SECURITY_TRACKABLE = True +SECURITY_REGISTERABLE = True +SECURITY_RECOVERABLE = True diff --git a/wqflask/secure_server.py b/wqflask/secure_server.py index 49e0b433..425fce89 100644 --- a/wqflask/secure_server.py +++ b/wqflask/secure_server.py @@ -4,15 +4,8 @@ from wqflask import app from flask import Flask, render_template from flask.ext.sqlalchemy import SQLAlchemy -from flask.ext.security import Security, SQLAlchemyUserDatastore, \ - UserMixin, RoleMixin +from flask.ext.security import Security, SQLAlchemyUserDatastore, UserMixin, RoleMixin -# Create app -#app = Flask(__name__) -app.config['SECRET_KEY'] = 'LjfrbDOlvdFMT5cCi9qrJqStxK4NcmxW' -app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://webqtl:f2ZypIflRM@gn.cazhbciu2y1i.us-east-1.rds.amazonaws.com/db_webqtl' -#app.config['SECURITY_CONFIRMABLE'] = True -app.config['SECURITY_TRACKABLE'] = True # Create database connection object db = SQLAlchemy(app) @@ -48,19 +41,14 @@ user_datastore = SQLAlchemyUserDatastore(db, User, Role) security = Security(app, user_datastore) # Create a user to test with -#@app.before_first_request -def create_user(): - db.create_all() - user_datastore.create_user(email='matt@example.com', password='notebook') - db.session.commit() +##@app.before_first_request +#def create_user(): +# db.create_all() +# user_datastore.create_user(email='matt@example.com', password='notebook') +# db.session.commit() -## Views -#@app.route('/') -#def home(): -# return render_template('index.html') import logging -#from themodule import TheHandlerYouWant file_handler = logging.FileHandler("/tmp/flask_gn_log") file_handler.setLevel(logging.DEBUG) app.logger.addHandler(file_handler) diff --git a/wqflask/wqflask/templates/security/_macros.html b/wqflask/wqflask/templates/security/_macros.html new file mode 100644 index 00000000..8575f3db --- /dev/null +++ b/wqflask/wqflask/templates/security/_macros.html @@ -0,0 +1,16 @@ +{% macro render_field_with_errors(field) %} +

+ {{ field.label }} {{ field(**kwargs)|safe }} + {% if field.errors %} +

+ {% endif %} +

+{% endmacro %} + +{% macro render_field(field) %} +

{{ field(**kwargs)|safe }}

+{% endmacro %} \ No newline at end of file diff --git a/wqflask/wqflask/templates/security/_menu.html b/wqflask/wqflask/templates/security/_menu.html new file mode 100644 index 00000000..5291f809 --- /dev/null +++ b/wqflask/wqflask/templates/security/_menu.html @@ -0,0 +1,15 @@ +{% if security.registerable or security.recoverable or security.confirmabled %} +

Menu

+ +{% endif %} diff --git a/wqflask/wqflask/templates/security/_messages.html b/wqflask/wqflask/templates/security/_messages.html new file mode 100644 index 00000000..179d0636 --- /dev/null +++ b/wqflask/wqflask/templates/security/_messages.html @@ -0,0 +1,9 @@ +{%- with messages = get_flashed_messages(with_categories=true) -%} + {% if messages %} + + {% endif %} +{%- endwith %} \ No newline at end of file diff --git a/wqflask/wqflask/templates/security/register_user.html b/wqflask/wqflask/templates/security/register_user.html new file mode 100644 index 00000000..af87f810 --- /dev/null +++ b/wqflask/wqflask/templates/security/register_user.html @@ -0,0 +1,45 @@ +{% from "security/_macros.html" import render_field_with_errors, render_field %} +{% extends "base.html" %} +{% include "security/_messages.html" %} +{% block content %} + +
+
+
+ +
+
+
+ + +{% include "security/_menu.html" %} + +{% endblock %} + + \ No newline at end of file -- cgit v1.2.3 From 34312cfacdcb5af450d33ac3b54d7c01a6a61788 Mon Sep 17 00:00:00 2001 From: Lei Yan Date: Tue, 30 Apr 2013 22:15:38 +0000 Subject: Changed path to log file Added server port to configuration file --- wqflask/cfg/default_settings.py | 2 ++ wqflask/secure_server.py | 5 ++++- wqflask/wqflask/dataSharing/SharingInfo.py | 12 ++++++------ 3 files changed, 12 insertions(+), 7 deletions(-) (limited to 'wqflask/secure_server.py') diff --git a/wqflask/cfg/default_settings.py b/wqflask/cfg/default_settings.py index a575a3bd..d0713e4d 100644 --- a/wqflask/cfg/default_settings.py +++ b/wqflask/cfg/default_settings.py @@ -1,5 +1,7 @@ LOGFILE = """/tmp/flask_gn_log""" +SERVER_PORT = 5000 + #This is needed because Flask turns key errors into a #400 bad request response with no exception/log TRAP_BAD_REQUEST_ERRORS = True diff --git a/wqflask/secure_server.py b/wqflask/secure_server.py index 425fce89..5448dbeb 100644 --- a/wqflask/secure_server.py +++ b/wqflask/secure_server.py @@ -49,16 +49,19 @@ security = Security(app, user_datastore) import logging -file_handler = logging.FileHandler("/tmp/flask_gn_log") +file_handler = logging.FileHandler(app.config['LOGFILE']) file_handler.setLevel(logging.DEBUG) app.logger.addHandler(file_handler) import logging_tree logging_tree.printout() +#print("app.config is:", app.config) + if __name__ == '__main__': #create_user() app.run(host='0.0.0.0', + port=app.config['SERVER_PORT'], use_debugger=False, threaded=True, use_reloader=True) diff --git a/wqflask/wqflask/dataSharing/SharingInfo.py b/wqflask/wqflask/dataSharing/SharingInfo.py index befc158a..41a75222 100755 --- a/wqflask/wqflask/dataSharing/SharingInfo.py +++ b/wqflask/wqflask/dataSharing/SharingInfo.py @@ -34,12 +34,12 @@ import requests from dbFunction import webqtlDatabaseFunction import SharingBody -import logging -logging.basicConfig(filename="/tmp/flask_gn_log", level=logging.INFO) - -_log = logging.getLogger("search") -_ch = logging.StreamHandler() -_log.addHandler(_ch) +#import logging +#logging.basicConfig(filename="/tmp/flask_gn_log", level=logging.INFO) +# +#_log = logging.getLogger("search") +#_ch = logging.StreamHandler() +#_log.addHandler(_ch) -- cgit v1.2.3 From 1cf6894c7416f879fcd114ae7358bb7d4169a677 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 9 May 2013 22:28:22 +0000 Subject: Working on user registration --- wqflask/secure_server.py | 9 +++-- wqflask/wqflask/templates/base.html | 30 +++++++++++++--- wqflask/wqflask/templates/index_page.html | 7 ++-- .../wqflask/templates/security/register_user.html | 40 +++------------------- 4 files changed, 39 insertions(+), 47 deletions(-) (limited to 'wqflask/secure_server.py') diff --git a/wqflask/secure_server.py b/wqflask/secure_server.py index 5448dbeb..60f6db44 100644 --- a/wqflask/secure_server.py +++ b/wqflask/secure_server.py @@ -7,6 +7,11 @@ from flask.ext.sqlalchemy import SQLAlchemy from flask.ext.security import Security, SQLAlchemyUserDatastore, UserMixin, RoleMixin +# Setup mail +from flask.ext.mail import Mail +mail = Mail(app) + + # Create database connection object db = SQLAlchemy(app) @@ -26,13 +31,13 @@ class User(db.Model, UserMixin): password = db.Column(db.String(255)) active = db.Column(db.Boolean()) confirmed_at = db.Column(db.DateTime()) - + last_login_at = db.Column(db.DateTime()) current_login_at = db.Column(db.DateTime()) last_login_ip_= db.Column(db.String(39)) current_login_ip = db.Column(db.String(39)) login_count = db.Column(db.Integer()) - + roles = db.relationship('Role', secondary=roles_users, backref=db.backref('users', lazy='dynamic')) diff --git a/wqflask/wqflask/templates/base.html b/wqflask/wqflask/templates/base.html index 71c12941..6f4b8e1e 100644 --- a/wqflask/wqflask/templates/base.html +++ b/wqflask/wqflask/templates/base.html @@ -14,9 +14,9 @@ - + {% block css %} {% endblock %} @@ -57,13 +57,17 @@ News
  • - References + References +
  • +
  • + Policies
  • - Policies + Links
  • - Links + Login
  • @@ -137,6 +141,22 @@ + + + + diff --git a/wqflask/wqflask/templates/security/_macros.html b/wqflask/wqflask/templates/security/_macros.html index 8575f3db..919b979a 100644 --- a/wqflask/wqflask/templates/security/_macros.html +++ b/wqflask/wqflask/templates/security/_macros.html @@ -13,4 +13,4 @@ {% macro render_field(field) %}

    {{ field(**kwargs)|safe }}

    -{% endmacro %} \ No newline at end of file +{% endmacro %} diff --git a/wqflask/wqflask/templates/security/login_user.html b/wqflask/wqflask/templates/security/login_user.html index d781ce08..b5fcbfdc 100644 --- a/wqflask/wqflask/templates/security/login_user.html +++ b/wqflask/wqflask/templates/security/login_user.html @@ -5,8 +5,13 @@ {{ login_user_form.hidden_tag() }} {{ render_field_with_errors(login_user_form.email) }} {{ render_field_with_errors(login_user_form.password) }} + + {% if security.recoverable %} + Forgot your password?
    + {% endif %} + {{ render_field_with_errors(login_user_form.remember) }} {{ render_field(login_user_form.next) }} {{ render_field(login_user_form.submit) }} -{% include "security/_menu.html" %} \ No newline at end of file + diff --git a/wqflask/wqflask/user_manager.py b/wqflask/wqflask/user_manager.py new file mode 100644 index 00000000..4d608dc7 --- /dev/null +++ b/wqflask/wqflask/user_manager.py @@ -0,0 +1,22 @@ +from __future__ import print_function, division, absolute_import + +"""Access things in template like this: + + x: {{ g.identity.name }} + security: {{ security.__dict__ }} + +""" + +from wqflask import model + +from flask import Flask, g + +#from app import db +print("globals are:", globals()) + + +class UserManager(object): + def __init__(self): + self.users = model.User.query.all() + print("Users are:", self.users) + diff --git a/wqflask/wqflask/views.py b/wqflask/wqflask/views.py index 8531561a..dadce4d5 100644 --- a/wqflask/wqflask/views.py +++ b/wqflask/wqflask/views.py @@ -35,6 +35,8 @@ from utility.benchmark import Bench from pprint import pformat as pf +from wqflask import user_manager + #import logging #logging.basicConfig(filename="/tmp/gn_log", level=logging.INFO) #_log = logging.getLogger("correlation") @@ -166,21 +168,21 @@ def marker_regression_page(): 'dataset', 'suggestive' ) - + start_vars = {} for key, value in initial_start_vars.iteritems(): if key in wanted or key.startswith(('value:')): start_vars[key] = value - + version = "v14" key = "marker_regression:{}:".format(version) + json.dumps(start_vars, sort_keys=True) with Bench("Loading cache"): result = Redis.get(key) - + #print("************************ Starting result *****************") #print("result is [{}]: {}".format(type(result), result)) #print("************************ Ending result ********************") - + if result: print("Cache hit!!!") with Bench("Loading results"): @@ -194,17 +196,17 @@ def marker_regression_page(): indent=" ") result = template_vars.__dict__ - + #for item in template_vars.__dict__.keys(): # print(" ---**--- {}: {}".format(type(template_vars.__dict__[item]), item)) - + #causeerror Redis.set(key, pickle.dumps(result)) Redis.expire(key, 60*60) - + with Bench("Rendering template"): rendered_template = render_template("marker_regression.html", **result) - + return rendered_template @@ -234,6 +236,11 @@ def get_temp_data(): temp_uuid = request.args['key'] return flask.jsonify(temp_data.TempData(temp_uuid).get_all()) +@app.route("/users") +def manage_users(): + template_vars = user_manager.UserManager() + return render_template("admin/user_manager.html", **template_vars.__dict__) + def json_default_handler(obj): '''Based on http://stackoverflow.com/a/2680060/1175849''' @@ -251,4 +258,4 @@ def json_default_handler(obj): # return None else: raise TypeError, 'Object of type %s with value of %s is not JSON serializable' % ( - type(obj), repr(obj)) \ No newline at end of file + type(obj), repr(obj)) -- cgit v1.2.3