Coder Social home page Coder Social logo

shreyanshk / flask-firehose Goto Github PK

View Code? Open in Web Editor NEW
3.0 2.0 1.0 67 KB

Flask extension to add HTTP/2 server push.

License: MIT License

Python 34.06% Makefile 4.84% Shell 0.32% CSS 37.58% JavaScript 4.61% HTML 12.60% Dockerfile 4.02% Nix 1.97%

flask-firehose's Introduction

Flask-Firehose

HTTP/2 Server Push for your Flask apps.

Installation

pip install flask-firehose

Usage

Initialization

Direct initialization:

app = Flask(__name__)
Firehose(app)

With application factories:

firehose = Firehose()

def create_app():
    app = Flask(__name__)
    firehose.init_app(app)
    return app

Pushing resources

Let the HTML template writer decide what to push:

{% extends 'base.html' %}
{% block body %}
    <link rel="stylesheet" href="{{ push('/static/css/main.css', as='style', rel='preload') }}">
    This is some document.
{% endblock %}

Let the backend developer decide what to push:

from flask_firehose import push

@app.route('/someroute')
def render_someroute():
    push('/static/css/main.css', **{'as': 'style', 'rel': 'preload'})
    return render_template('some_template')

Tracking pushed resources

Ideally, resources already pushed during a session shouldn't be pushed again. So, Flask-Firehose includes a simple utility class to track pushed resources using session variable 'h2-pushed'. Additionally, Flask-Firehose can also work with external code to track pushed resources in case the provided implementation is unsuitable.

class Custom_connector():

    def get_pushed(self):
        """Returns a set of items that have been already pushed to client.

        Returns
        -------
        set
            Set of items that are pushed.

        """
        # your code here

    def set_pushed(self, inset):
        """Update client state after pushing more items at the end of request.

        Parameters
        ----------
        inset : set
            A set of URLs of pushed items.
        """
        # your code here

Using custom connector with Firehose

firehose = Firehose(connector=Custom_connector())
firehose.init_app(app)

Configure NGINX

location = /myapp {
    proxy_pass http://upstream;
    http2_push_preload on;
}

Read more at: https://www.nginx.com/blog/nginx-1-13-9-http2-server-push/

Testing

To initialize a development environment in ./venv:

make devenv

To run unit tests:

make test

To run integration testing with NGINX with docker:

make dockertest

flask-firehose's People

Contributors

marimeireles avatar shreyanshk avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar

Forkers

marimeireles

flask-firehose's Issues

Typo on README

Hi!
I think there is a typo in your README.rst file. In the Pushing resources section it's written that we should use something like push('/static/css/main.css', as='style', rel='preload') to push files, but the as will cause python to crash.
Going through the repo I found this example:

push('/static/js/vendor/modernizr-3.5.0.min.js', rel='preload')

Where you're not using as.

Testing on my computer I found that not using as like you did in your tests allows python to run.

But when I test on my local server I get the following error:

<link rel=preload> must have a valid as value

Any idea of what might be happening here?

Thanks a lot!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.