[Flask] g/session/request

Craig Amundsen amundsen.craig at gene.com
Mon Jun 5 11:16:41 EDT 2017


OP here. I didn't initially try using DataTables because during my initial
search for flask sortable table I found the Flask-Table library, but did
not see the DataTables extension of jquery. It does seem like a better
solution to my problem, now I just have to figure out how to get jquery up
and running in my app...

Thanks for the responses.

- Craig

On Sat, Jun 3, 2017 at 5:50 AM, Corey Boyle <coreybrett at gmail.com> wrote:

> Replies inline below.
>
>
> __
> Corey
>
> On Jun 3, 2017 1:45 AM, "Gergely Polonkai" <gergely at polonkai.eu> wrote:
>
>
>
> On Fri, Jun 2, 2017, 16:08 Corey Boyle <coreybrett at gmail.com> wrote:
>
>> I could be wrong about this, but...
>>
>> The default session storage is done with cookies, so if you store the
>> data in the session, all that data will get shipped back and forth
>> with each request made by the client. Also, cookies have a storage
>> limit that may be an issue.
>>
>> The "g" proxy object is tied to the request context, so anything
>> stored on it will be garbage collected when the request is fulfilled.
>>
>
> Not anymore. With 0.10, it is tied to app context, so it doesn't get
> collected, but introduces another problem: every user of the system will
> see the same data.
>
>
> *Yep, I messed up the details on g. However, it still can't be used for
> storing data between requests.*
>
>
>
>
>> Option 1 - Create a new function outside your view function used
>> solely for building your data. Either write some custom caching code
>> inside that function, or use something like Flask-Caching. Then call
>> that function inside your view function.
>>
>
> +1 on Flask-Caching, but beware if you fetch your data through an ORM like
> SQLAlchemy. They don't play nice with caching.
>
>
> *If I understood correctly, the OP is building a Python dictionary from
> his data source, so the dictionary should be easily serialized by
> Flask-Caching. The reason I suggested moving that code into an isolated
> function, was that he could potentially use one of the provided decorators
> from that extension.*
>
>
>
>
>> Option 2 - Build the table in HTML as you are now, and allow the
>> sorting to be done on the client side using JS. DataTables
>> (https://datatables.net) is AMAZING and actually pretty easy to figure
>> out.
>>
>
> I was about to suggest the same, although there's probably a reason OP
> didn't do it that way. If this is a graphical browser only app, though,
> it's not a problem.
>
>
>> Option 3 - Option 1 + Option 2... Doing the sorting on the client side
>> would be much more efficient, and caching the data on the server side
>> would be advisable is you are expecting to handle many requests
>> simultaneously.
>>
>> On Fri, Jun 2, 2017 at 9:48 AM, Craig Amundsen <amundsen.craig at gene.com>
>> wrote:
>> > Hi -
>> >
>> > I'm trying to implement a sortable table using Flask-Table. My dummy
>> test
>> > works great. But querying my database and building the list of
>> dictionaries
>> > that the Table instance uses takes a certain amount of time. I'd like to
>> > keep that list of dictionaries around so when the User sorts on a
>> different
>> > column I don't have to build it again.
>> >
>> > Currently I have one page where the User indicates which information
>> they
>> > want in the table. When they click on the submit button I query the
>> > database, construct the dictionary, store the dictionary in the
>> session, and
>> > then call view that shows the table. That method grabs the dictionary
>> out of
>> > the session and constructs the table which is then sent to the html
>> > template. This all works great.
>> >
>> > Clicking on a column heading ends up calling the view that shows the
>> table
>> > again. This time, though, the session doesn't have the dictionary and
>> so an
>> > error gets thrown.
>> >
>> > I tried messing about with g, but I can't get that to work either. Does
>> > anyone have any hints on how I can save list so it's still available
>> when I
>> > sort the table?
>> >
>> > Here's some snippets to show what I'm doing:
>> >
>> > @main.route('/select-data', methods = ['GET', 'POST'])
>> > @login_required
>> > @view_data_required
>> > def select_data():
>> >     form = SelectDataForm()
>> >     if form.validate_on_submit():
>> >         colsToShow = { 'showName' : True,
>> >                        'showX'    : form.showX.data,
>> >                        'showY'    : form.showY.data,
>> >                        'showZ'    : form.showZ.data }
>> >         session.dataFlags = colsToShow
>> >
>> >         # Build the list that Table wants
>> >
>> >         session.theList = theList
>> >         return show_data()
>> >     return render_template(select_data.html", form = form)
>> >
>> > @main.route('/show-data')
>> > @login_required
>> > @view_data_required
>> > def show_data():
>> >     colsToShow =  session.dataFlags
>> >
>> >     TableClass = create_table()
>> >     for key, attr, header in [('showName', 'name', "Name"), ('showX',
>> 'x',
>> > "X"),
>> >                               ("showY", "y", "Y"), ("showZ", "z", "Z")]:
>> >         if colsToShow[key]:
>> >             TableClass.add_column(attr, Col(header))
>> >
>> >     TableClass.allow_sort = True
>> >     TableClass.sort_url = sort_url
>> >     TableClass.classes = ["table", "table-hover", "followers"]
>> >
>> >     sort = request.args.get('sort', 'name')
>> >     direction = request.args.get('direction', 'asc')
>> >     reverse = (request.args.get('direction', 'asc') == 'desc')
>> >
>> >     theList = session.theList
>> >     theList = sorted(theList, key = lambda x: x[sort], reverse =
>> reverse)
>> >     table = TableClass(things, sort_by = sort, sort_reverse = reverse)
>> >
>> >     return render_template("dump_data.html", table = table, sort =
>> sort,
>> > direction = direction)
>> >
>> > def sort_url(self, col_key, reverse=False):
>> >     if reverse: direction = 'desc'
>> >     else: direction = 'asc'
>> >     return url_for('.show_data', sort=col_key, direction=direction)
>> >
>> >
>> > I've tried re-assigning session.theList and session.colsToShow at the
>> bottom
>> > of show_data, but that doesn't work. I've tried messing around with
>> with g
>> > instead of session, but I don't seem to grasp its use any better.
>> >
>> > If anyone has any hints on making the session/g/request know about the
>> two
>> > things I need to store there the second time I call show_data (by
>> clicking
>> > on a column header), I'd be most appreciative.
>> >
>> > Thanks,
>> > - Craig
>> >
>> > _______________________________________________
>> > Flask mailing list
>> > Flask at python.org
>> > https://mail.python.org/mailman/listinfo/flask
>> >
>> _______________________________________________
>> Flask mailing list
>> Flask at python.org
>> https://mail.python.org/mailman/listinfo/flask
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/flask/attachments/20170605/947eeb41/attachment.html>


More information about the Flask mailing list