Add give_token, catch_etiquette_exception to all endpoints at once.

This commit is contained in:
voussoir 2020-09-12 11:43:25 -07:00
parent f7e5b639e3
commit 42d4b7fafb
7 changed files with 22 additions and 63 deletions

View file

@ -10,6 +10,7 @@ from voussoirkit import pathclass
import etiquette import etiquette
from . import caching from . import caching
from . import decorators
from . import jinja_filters from . import jinja_filters
from . import jsonify from . import jsonify
from . import sessions from . import sessions
@ -45,6 +46,27 @@ file_cache_manager = caching.FileCacheManager(
max_age=BROWSER_CACHE_DURATION, max_age=BROWSER_CACHE_DURATION,
) )
# Flask provides decorators for before_request and after_request, but not for
# wrapping the whole request. The decorators I am using need to wrap the whole
# request, either to catch exceptions (which don't get passed through
# after_request) or to maintain some state before running the function and
# adding it to the response after.
# Instead of copy-pasting my decorators onto every single function and
# forgetting to keep up with them in the future, let's just hijack the
# decorator I know every endpoint will have: site.route.
_original_route = site.route
def decorate_and_route(*route_args, **route_kwargs):
def wrapper(endpoint):
if not hasattr(endpoint, '_fully_decorated'):
endpoint = decorators.catch_etiquette_exception(endpoint)
endpoint = session_manager.give_token(endpoint)
endpoint = _original_route(*route_args, **route_kwargs)(endpoint)
endpoint._fully_decorated = True
return endpoint
return wrapper
site.route = decorate_and_route
gzip_minimum_size = 500 gzip_minimum_size = 500
gzip_level = 3 gzip_level = 3
@site.after_request @site.after_request

View file

@ -14,7 +14,6 @@ session_manager = common.session_manager
# Individual albums ################################################################################ # Individual albums ################################################################################
@site.route('/album/<album_id>') @site.route('/album/<album_id>')
@session_manager.give_token
def get_album_html(album_id): def get_album_html(album_id):
album = common.P_album(album_id, response_type='html') album = common.P_album(album_id, response_type='html')
response = common.render_template( response = common.render_template(
@ -26,7 +25,6 @@ def get_album_html(album_id):
return response return response
@site.route('/album/<album_id>.json') @site.route('/album/<album_id>.json')
@session_manager.give_token
def get_album_json(album_id): def get_album_json(album_id):
album = common.P_album(album_id, response_type='json') album = common.P_album(album_id, response_type='json')
album = etiquette.jsonify.album(album) album = etiquette.jsonify.album(album)
@ -56,7 +54,6 @@ def get_album_zip(album_id):
return flask.Response(streamed_zip, headers=outgoing_headers) return flask.Response(streamed_zip, headers=outgoing_headers)
@site.route('/album/<album_id>/add_child', methods=['POST']) @site.route('/album/<album_id>/add_child', methods=['POST'])
@decorators.catch_etiquette_exception
@decorators.required_fields(['child_id'], forbid_whitespace=True) @decorators.required_fields(['child_id'], forbid_whitespace=True)
def post_album_add_child(album_id): def post_album_add_child(album_id):
album = common.P_album(album_id, response_type='json') album = common.P_album(album_id, response_type='json')
@ -66,7 +63,6 @@ def post_album_add_child(album_id):
return jsonify.make_json_response(response) return jsonify.make_json_response(response)
@site.route('/album/<album_id>/remove_child', methods=['POST']) @site.route('/album/<album_id>/remove_child', methods=['POST'])
@decorators.catch_etiquette_exception
@decorators.required_fields(['child_id'], forbid_whitespace=True) @decorators.required_fields(['child_id'], forbid_whitespace=True)
def post_album_remove_child(album_id): def post_album_remove_child(album_id):
album = common.P_album(album_id, response_type='json') album = common.P_album(album_id, response_type='json')
@ -76,7 +72,6 @@ def post_album_remove_child(album_id):
return jsonify.make_json_response(response) return jsonify.make_json_response(response)
@site.route('/album/<album_id>/refresh_directories', methods=['POST']) @site.route('/album/<album_id>/refresh_directories', methods=['POST'])
@decorators.catch_etiquette_exception
def post_album_refresh_directories(album_id): def post_album_refresh_directories(album_id):
album = common.P_album(album_id, response_type='json') album = common.P_album(album_id, response_type='json')
for directory in album.get_associated_directories(): for directory in album.get_associated_directories():
@ -87,8 +82,6 @@ def post_album_refresh_directories(album_id):
# Album photo operations ########################################################################### # Album photo operations ###########################################################################
@site.route('/album/<album_id>/add_photo', methods=['POST']) @site.route('/album/<album_id>/add_photo', methods=['POST'])
@session_manager.give_token
@decorators.catch_etiquette_exception
@decorators.required_fields(['photo_id'], forbid_whitespace=True) @decorators.required_fields(['photo_id'], forbid_whitespace=True)
def post_album_add_photo(album_id): def post_album_add_photo(album_id):
''' '''
@ -103,8 +96,6 @@ def post_album_add_photo(album_id):
return jsonify.make_json_response(response) return jsonify.make_json_response(response)
@site.route('/album/<album_id>/remove_photo', methods=['POST']) @site.route('/album/<album_id>/remove_photo', methods=['POST'])
@session_manager.give_token
@decorators.catch_etiquette_exception
@decorators.required_fields(['photo_id'], forbid_whitespace=True) @decorators.required_fields(['photo_id'], forbid_whitespace=True)
def post_album_remove_photo(album_id): def post_album_remove_photo(album_id):
''' '''
@ -121,8 +112,6 @@ def post_album_remove_photo(album_id):
# Album tag operations ############################################################################# # Album tag operations #############################################################################
@site.route('/album/<album_id>/add_tag', methods=['POST']) @site.route('/album/<album_id>/add_tag', methods=['POST'])
@decorators.catch_etiquette_exception
@session_manager.give_token
def post_album_add_tag(album_id): def post_album_add_tag(album_id):
''' '''
Apply a tag to every photo in the album. Apply a tag to every photo in the album.
@ -146,8 +135,6 @@ def post_album_add_tag(album_id):
# Album metadata operations ######################################################################## # Album metadata operations ########################################################################
@site.route('/album/<album_id>/edit', methods=['POST']) @site.route('/album/<album_id>/edit', methods=['POST'])
@session_manager.give_token
@decorators.catch_etiquette_exception
def post_album_edit(album_id): def post_album_edit(album_id):
''' '''
Edit the title / description. Edit the title / description.
@ -168,7 +155,6 @@ def get_albums_core():
return albums return albums
@site.route('/albums') @site.route('/albums')
@session_manager.give_token
def get_albums_html(): def get_albums_html():
albums = get_albums_core() albums = get_albums_core()
response = common.render_template( response = common.render_template(
@ -180,7 +166,6 @@ def get_albums_html():
return response return response
@site.route('/albums.json') @site.route('/albums.json')
@session_manager.give_token
def get_albums_json(): def get_albums_json():
albums = get_albums_core() albums = get_albums_core()
albums = [etiquette.jsonify.album(album, minimal=True) for album in albums] albums = [etiquette.jsonify.album(album, minimal=True) for album in albums]
@ -189,8 +174,6 @@ def get_albums_json():
# Album create and delete ########################################################################## # Album create and delete ##########################################################################
@site.route('/albums/create_album', methods=['POST']) @site.route('/albums/create_album', methods=['POST'])
@session_manager.give_token
@decorators.catch_etiquette_exception
def post_albums_create(): def post_albums_create():
title = request.form.get('title', None) title = request.form.get('title', None)
description = request.form.get('description', None) description = request.form.get('description', None)
@ -209,8 +192,6 @@ def post_albums_create():
return jsonify.make_json_response(response) return jsonify.make_json_response(response)
@site.route('/album/<album_id>/delete', methods=['POST']) @site.route('/album/<album_id>/delete', methods=['POST'])
@session_manager.give_token
@decorators.catch_etiquette_exception
def post_album_delete(album_id): def post_album_delete(album_id):
album = common.P_album(album_id, response_type='json') album = common.P_album(album_id, response_type='json')
album.delete(commit=True) album.delete(commit=True)

View file

@ -10,7 +10,6 @@ session_manager = common.session_manager
#################################################################################################### ####################################################################################################
@site.route('/') @site.route('/')
@session_manager.give_token
def root(): def root():
motd = random.choice(common.P.config['motd_strings']) motd = random.choice(common.P.config['motd_strings'])
return common.render_template(request, 'root.html', motd=motd) return common.render_template(request, 'root.html', motd=motd)
@ -21,7 +20,6 @@ def favicon():
return flask.send_file(common.FAVICON_PATH.absolute_path) return flask.send_file(common.FAVICON_PATH.absolute_path)
@site.route('/apitest') @site.route('/apitest')
@session_manager.give_token
def apitest(): def apitest():
response = flask.Response('testing') response = flask.Response('testing')
return response return response

View file

@ -13,15 +13,12 @@ session_manager = common.session_manager
# Individual bookmarks ############################################################################# # Individual bookmarks #############################################################################
@site.route('/bookmark/<bookmark_id>.json') @site.route('/bookmark/<bookmark_id>.json')
@session_manager.give_token
def get_bookmark_json(bookmark_id): def get_bookmark_json(bookmark_id):
bookmark = common.P_bookmark(bookmark_id, response_type='json') bookmark = common.P_bookmark(bookmark_id, response_type='json')
response = etiquette.jsonify.bookmark(bookmark) response = etiquette.jsonify.bookmark(bookmark)
return jsonify.make_json_response(response) return jsonify.make_json_response(response)
@site.route('/bookmark/<bookmark_id>/edit', methods=['POST']) @site.route('/bookmark/<bookmark_id>/edit', methods=['POST'])
@session_manager.give_token
@decorators.catch_etiquette_exception
def post_bookmark_edit(bookmark_id): def post_bookmark_edit(bookmark_id):
bookmark = common.P_bookmark(bookmark_id, response_type='json') bookmark = common.P_bookmark(bookmark_id, response_type='json')
# Emptystring is okay for titles, but not for URL. # Emptystring is okay for titles, but not for URL.
@ -36,13 +33,11 @@ def post_bookmark_edit(bookmark_id):
# Bookmark listings ################################################################################ # Bookmark listings ################################################################################
@site.route('/bookmarks') @site.route('/bookmarks')
@session_manager.give_token
def get_bookmarks_html(): def get_bookmarks_html():
bookmarks = list(common.P.get_bookmarks()) bookmarks = list(common.P.get_bookmarks())
return common.render_template(request, 'bookmarks.html', bookmarks=bookmarks) return common.render_template(request, 'bookmarks.html', bookmarks=bookmarks)
@site.route('/bookmarks.json') @site.route('/bookmarks.json')
@session_manager.give_token
def get_bookmarks_json(): def get_bookmarks_json():
bookmarks = [etiquette.jsonify.bookmark(b) for b in common.P.get_bookmarks()] bookmarks = [etiquette.jsonify.bookmark(b) for b in common.P.get_bookmarks()]
return jsonify.make_json_response(bookmarks) return jsonify.make_json_response(bookmarks)
@ -50,7 +45,6 @@ def get_bookmarks_json():
# Bookmark create and delete ####################################################################### # Bookmark create and delete #######################################################################
@site.route('/bookmarks/create_bookmark', methods=['POST']) @site.route('/bookmarks/create_bookmark', methods=['POST'])
@decorators.catch_etiquette_exception
@decorators.required_fields(['url'], forbid_whitespace=True) @decorators.required_fields(['url'], forbid_whitespace=True)
def post_bookmark_create(): def post_bookmark_create():
url = request.form['url'] url = request.form['url']
@ -62,7 +56,6 @@ def post_bookmark_create():
return response return response
@site.route('/bookmark/<bookmark_id>/delete', methods=['POST']) @site.route('/bookmark/<bookmark_id>/delete', methods=['POST'])
@decorators.catch_etiquette_exception
def post_bookmark_delete(bookmark_id): def post_bookmark_delete(bookmark_id):
bookmark = common.P_bookmark(bookmark_id, response_type='json') bookmark = common.P_bookmark(bookmark_id, response_type='json')
bookmark.delete(commit=True) bookmark.delete(commit=True)

View file

@ -19,13 +19,11 @@ photo_download_zip_tokens = cacheclass.Cache(maxlen=100)
# Individual photos ################################################################################ # Individual photos ################################################################################
@site.route('/photo/<photo_id>') @site.route('/photo/<photo_id>')
@session_manager.give_token
def get_photo_html(photo_id): def get_photo_html(photo_id):
photo = common.P_photo(photo_id, response_type='html') photo = common.P_photo(photo_id, response_type='html')
return common.render_template(request, 'photo.html', photo=photo) return common.render_template(request, 'photo.html', photo=photo)
@site.route('/photo/<photo_id>.json') @site.route('/photo/<photo_id>.json')
@session_manager.give_token
def get_photo_json(photo_id): def get_photo_json(photo_id):
photo = common.P_photo(photo_id, response_type='json') photo = common.P_photo(photo_id, response_type='json')
photo = etiquette.jsonify.photo(photo) photo = etiquette.jsonify.photo(photo)
@ -71,8 +69,6 @@ def get_thumbnail(photo_id):
# Photo create and delete ########################################################################## # Photo create and delete ##########################################################################
@site.route('/photo/<photo_id>/delete', methods=['POST']) @site.route('/photo/<photo_id>/delete', methods=['POST'])
@decorators.catch_etiquette_exception
@session_manager.give_token
def post_photo_delete(photo_id): def post_photo_delete(photo_id):
print(photo_id) print(photo_id)
photo = common.P_photo(photo_id, response_type='json') photo = common.P_photo(photo_id, response_type='json')
@ -83,7 +79,6 @@ def post_photo_delete(photo_id):
# Photo tag operations ############################################################################# # Photo tag operations #############################################################################
@decorators.catch_etiquette_exception
def post_photo_add_remove_tag_core(photo_ids, tagname, add_or_remove): def post_photo_add_remove_tag_core(photo_ids, tagname, add_or_remove):
if isinstance(photo_ids, str): if isinstance(photo_ids, str):
photo_ids = etiquette.helpers.comma_space_split(photo_ids) photo_ids = etiquette.helpers.comma_space_split(photo_ids)
@ -149,7 +144,6 @@ def post_batch_photos_remove_tag():
# Photo metadata operations ######################################################################## # Photo metadata operations ########################################################################
@decorators.catch_etiquette_exception
@site.route('/photo/<photo_id>/generate_thumbnail', methods=['POST']) @site.route('/photo/<photo_id>/generate_thumbnail', methods=['POST'])
def post_photo_generate_thumbnail(photo_id): def post_photo_generate_thumbnail(photo_id):
special = request.form.to_dict() special = request.form.to_dict()
@ -161,7 +155,6 @@ def post_photo_generate_thumbnail(photo_id):
response = jsonify.make_json_response({}) response = jsonify.make_json_response({})
return response return response
@decorators.catch_etiquette_exception
def post_photo_refresh_metadata_core(photo_ids): def post_photo_refresh_metadata_core(photo_ids):
if isinstance(photo_ids, str): if isinstance(photo_ids, str):
photo_ids = etiquette.helpers.comma_space_split(photo_ids) photo_ids = etiquette.helpers.comma_space_split(photo_ids)
@ -193,21 +186,18 @@ def post_batch_photos_refresh_metadata():
response = post_photo_refresh_metadata_core(photo_ids=request.form['photo_ids']) response = post_photo_refresh_metadata_core(photo_ids=request.form['photo_ids'])
return response return response
@decorators.catch_etiquette_exception
@site.route('/photo/<photo_id>/set_searchhidden', methods=['POST']) @site.route('/photo/<photo_id>/set_searchhidden', methods=['POST'])
def post_photo_set_searchhidden(photo_id): def post_photo_set_searchhidden(photo_id):
photo = common.P_photo(photo_id, response_type='json') photo = common.P_photo(photo_id, response_type='json')
photo.set_searchhidden(True) photo.set_searchhidden(True)
return jsonify.make_json_response({}) return jsonify.make_json_response({})
@decorators.catch_etiquette_exception
@site.route('/photo/<photo_id>/unset_searchhidden', methods=['POST']) @site.route('/photo/<photo_id>/unset_searchhidden', methods=['POST'])
def post_photo_unset_searchhidden(photo_id): def post_photo_unset_searchhidden(photo_id):
photo = common.P_photo(photo_id, response_type='json') photo = common.P_photo(photo_id, response_type='json')
photo.set_searchhidden(False) photo.set_searchhidden(False)
return jsonify.make_json_response({}) return jsonify.make_json_response({})
@decorators.catch_etiquette_exception
def post_batch_photos_searchhidden_core(photo_ids, searchhidden): def post_batch_photos_searchhidden_core(photo_ids, searchhidden):
if isinstance(photo_ids, str): if isinstance(photo_ids, str):
photo_ids = etiquette.helpers.comma_space_split(photo_ids) photo_ids = etiquette.helpers.comma_space_split(photo_ids)
@ -236,7 +226,6 @@ def post_batch_photos_unset_searchhidden():
# Clipboard ######################################################################################## # Clipboard ########################################################################################
@site.route('/clipboard') @site.route('/clipboard')
@session_manager.give_token
def get_clipboard_page(): def get_clipboard_page():
return common.render_template(request, 'clipboard.html') return common.render_template(request, 'clipboard.html')
@ -452,7 +441,6 @@ def get_search_core():
return final_results return final_results
@site.route('/search') @site.route('/search')
@session_manager.give_token
def get_search_html(): def get_search_html():
search_results = get_search_core() search_results = get_search_core()
response = common.render_template( response = common.render_template(
@ -468,7 +456,6 @@ def get_search_html():
return response return response
@site.route('/search.json') @site.route('/search.json')
@session_manager.give_token
def get_search_json(): def get_search_json():
search_results = get_search_core() search_results = get_search_core()
search_kwargs = search_results['search_kwargs'] search_kwargs = search_results['search_kwargs']

View file

@ -31,7 +31,6 @@ def get_tag_id_redirect(tag_id):
return flask.redirect(url) return flask.redirect(url)
@site.route('/tag/<specific_tag>/edit', methods=['POST']) @site.route('/tag/<specific_tag>/edit', methods=['POST'])
@decorators.catch_etiquette_exception
def post_tag_edit(specific_tag): def post_tag_edit(specific_tag):
tag = common.P_tag(specific_tag, response_type='json') tag = common.P_tag(specific_tag, response_type='json')
name = request.form.get('name', '').strip() name = request.form.get('name', '').strip()
@ -46,8 +45,6 @@ def post_tag_edit(specific_tag):
return response return response
@site.route('/tag/<tagname>/add_child', methods=['POST']) @site.route('/tag/<tagname>/add_child', methods=['POST'])
@decorators.catch_etiquette_exception
@session_manager.give_token
@decorators.required_fields(['child_name'], forbid_whitespace=True) @decorators.required_fields(['child_name'], forbid_whitespace=True)
def post_tag_add_child(tagname): def post_tag_add_child(tagname):
parent = common.P_tag(tagname, response_type='json') parent = common.P_tag(tagname, response_type='json')
@ -57,8 +54,6 @@ def post_tag_add_child(tagname):
return jsonify.make_json_response(response) return jsonify.make_json_response(response)
@site.route('/tag/<tagname>/remove_child', methods=['POST']) @site.route('/tag/<tagname>/remove_child', methods=['POST'])
@decorators.catch_etiquette_exception
@session_manager.give_token
@decorators.required_fields(['child_name'], forbid_whitespace=True) @decorators.required_fields(['child_name'], forbid_whitespace=True)
def post_tag_remove_child(tagname): def post_tag_remove_child(tagname):
parent = common.P_tag(tagname, response_type='json') parent = common.P_tag(tagname, response_type='json')
@ -79,7 +74,6 @@ def get_all_tag_names():
@site.route('/tag/<specific_tag_name>') @site.route('/tag/<specific_tag_name>')
@site.route('/tags') @site.route('/tags')
@session_manager.give_token
def get_tags_html(specific_tag_name=None): def get_tags_html(specific_tag_name=None):
if specific_tag_name is None: if specific_tag_name is None:
specific_tag = None specific_tag = None
@ -114,7 +108,6 @@ def get_tags_html(specific_tag_name=None):
@site.route('/tag/<specific_tag_name>.json') @site.route('/tag/<specific_tag_name>.json')
@site.route('/tags.json') @site.route('/tags.json')
@session_manager.give_token
def get_tags_json(specific_tag_name=None): def get_tags_json(specific_tag_name=None):
if specific_tag_name is None: if specific_tag_name is None:
specific_tag = None specific_tag = None
@ -137,8 +130,6 @@ def get_tags_json(specific_tag_name=None):
# Tag create and delete ############################################################################ # Tag create and delete ############################################################################
@site.route('/tags/create_tag', methods=['POST']) @site.route('/tags/create_tag', methods=['POST'])
@decorators.catch_etiquette_exception
@session_manager.give_token
@decorators.required_fields(['name'], forbid_whitespace=True) @decorators.required_fields(['name'], forbid_whitespace=True)
def post_tag_create(): def post_tag_create():
name = request.form['name'] name = request.form['name']
@ -149,8 +140,6 @@ def post_tag_create():
return jsonify.make_json_response(response) return jsonify.make_json_response(response)
@site.route('/tags/easybake', methods=['POST']) @site.route('/tags/easybake', methods=['POST'])
@decorators.catch_etiquette_exception
@session_manager.give_token
@decorators.required_fields(['easybake_string'], forbid_whitespace=True) @decorators.required_fields(['easybake_string'], forbid_whitespace=True)
def post_tag_easybake(): def post_tag_easybake():
easybake_string = request.form['easybake_string'] easybake_string = request.form['easybake_string']
@ -160,8 +149,6 @@ def post_tag_easybake():
return jsonify.make_json_response(notes) return jsonify.make_json_response(notes)
@site.route('/tag/<tagname>/delete', methods=['POST']) @site.route('/tag/<tagname>/delete', methods=['POST'])
@decorators.catch_etiquette_exception
@session_manager.give_token
def post_tag_delete(tagname): def post_tag_delete(tagname):
tag = common.P_tag(tagname, response_type='json') tag = common.P_tag(tagname, response_type='json')
tag.delete(commit=True) tag.delete(commit=True)
@ -169,8 +156,6 @@ def post_tag_delete(tagname):
return jsonify.make_json_response(response) return jsonify.make_json_response(response)
@site.route('/tag/<tagname>/remove_synonym', methods=['POST']) @site.route('/tag/<tagname>/remove_synonym', methods=['POST'])
@decorators.catch_etiquette_exception
@session_manager.give_token
@decorators.required_fields(['syn_name'], forbid_whitespace=True) @decorators.required_fields(['syn_name'], forbid_whitespace=True)
def post_tag_remove_synonym(tagname): def post_tag_remove_synonym(tagname):
syn_name = request.form['syn_name'] syn_name = request.form['syn_name']

View file

@ -14,13 +14,11 @@ session_manager = common.session_manager
# Individual users ################################################################################# # Individual users #################################################################################
@site.route('/user/<username>') @site.route('/user/<username>')
@session_manager.give_token
def get_user_html(username): def get_user_html(username):
user = common.P_user(username, response_type='html') user = common.P_user(username, response_type='html')
return common.render_template(request, 'user.html', user=user) return common.render_template(request, 'user.html', user=user)
@site.route('/user/<username>.json') @site.route('/user/<username>.json')
@session_manager.give_token
def get_user_json(username): def get_user_json(username):
user = common.P_user(username, response_type='json') user = common.P_user(username, response_type='json')
user = etiquette.jsonify.user(user) user = etiquette.jsonify.user(user)
@ -41,7 +39,6 @@ def get_user_id_redirect(user_id):
# Login and logout ################################################################################# # Login and logout #################################################################################
@site.route('/login', methods=['GET']) @site.route('/login', methods=['GET'])
@session_manager.give_token
def get_login(): def get_login():
response = common.render_template( response = common.render_template(
request, request,
@ -52,7 +49,6 @@ def get_login():
return response return response
@site.route('/login', methods=['POST']) @site.route('/login', methods=['POST'])
@session_manager.give_token
@decorators.required_fields(['username', 'password']) @decorators.required_fields(['username', 'password'])
def post_login(): def post_login():
session = session_manager.get(request) session = session_manager.get(request)
@ -82,7 +78,6 @@ def post_login():
return jsonify.make_json_response({}) return jsonify.make_json_response({})
@site.route('/logout', methods=['POST']) @site.route('/logout', methods=['POST'])
@session_manager.give_token
def logout(): def logout():
session_manager.remove(request) session_manager.remove(request)
response = jsonify.make_json_response({}) response = jsonify.make_json_response({})
@ -95,8 +90,6 @@ def get_register():
return flask.redirect('/login') return flask.redirect('/login')
@site.route('/register', methods=['POST']) @site.route('/register', methods=['POST'])
@session_manager.give_token
@decorators.catch_etiquette_exception
@decorators.required_fields(['username', 'password_1', 'password_2']) @decorators.required_fields(['username', 'password_1', 'password_2'])
def post_register(): def post_register():
session = session_manager.get(request) session = session_manager.get(request)