Code Monkey home page Code Monkey logo

sanic-jinja2's Introduction

sanic-jinja2

Jinja2 support for sanic

Example

Installation

python3 -m pip install sanic-jinja2

Features

sanic-jinja2 supports:

  • Flask-like flash method
  • i18n and Babel support
  • @jinja.template syntax
  • session extension support
  • factory pattern init_app method for creating apps

Usage

NOTICE:

If you want to use flash and get_flashed_messages, you need setup session first.

Currently, app and request are hooked into jinja templates, thus you can use them in template directly.

And, from version 0.3.0 enable_async is default to True. If you need sync functions, use jinja.render_sync, jinja.render_string_sync

Python3.5 does not support new async syntax, so 0.5.0 disable async back, sorry.

BUG: request should not be set to global environment, so you need use request['flash'] instead of jinja.flash and need pass request to render to use get_flashed_messages.

Examples

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from sanic import Sanic
from sanic_session import Session, InMemorySessionInterface
from sanic_jinja2 import SanicJinja2

app = Sanic()

session = Session(app, interface=InMemorySessionInterface())

jinja = SanicJinja2(app, session=session)
#
# Specify the package name, if templates/ dir is inside module
# jinja = SanicJinja2(app, pkg_name='sanicapp')
# or use customized templates path
# jinja = SanicJinja2(app, pkg_name='sanicapp', pkg_path='other/templates')
# or setup later
# jinja = SanicJinja2()
# jinja.init_app(app)

@app.route("/")
@jinja.template("index.html")
async def index(request):
    jinja.flash(request, "success message", "success")
    jinja.flash(request, "info message", "info")
    jinja.flash(request, "warning message", "warning")
    jinja.flash(request, "error message", "error")
    jinja.session(request)["user"] = "session user"
    return dict(greetings="Hello, template decorator!")


@app.route("/normal")
async def normal_index(request):
    jinja.flash(request, "success message", "success")
    jinja.flash(request, "info message", "info")
    jinja.flash(request, "warning message", "warning")
    jinja.flash(request, "error message", "error")
    jinja.session(request)["user"] = "session user"
    return jinja.render(
        "normal_index.html", request, greetings="Hello, tempalte render!"
    )


@app.route("/sync-handler")
@jinja.template("index.html")
def sync_hander(request):
    jinja.flash(request, "success message", "success")
    jinja.flash(request, "info message", "info")
    jinja.flash(request, "warning message", "warning")
    jinja.flash(request, "error message", "error")
    jinja.session(request)["user"] = "session user"
    return dict(greetings="Hello, sync handler!")


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000, debug=True, auto_reload=True)

sanic-jinja2's People

Contributors

dongweiming avatar em92 avatar hatarist avatar henry0312 avatar joshyujump avatar lixxu avatar pavel-fokin avatar stopspazzing avatar xen avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

sanic-jinja2's Issues

Usage with Blueprints

How would I pass the configured SanicJinja2 instance to my blueprints? I see the instance adds a reference to itself to app.extensions, but I'm unsure how to access it outside of the file where the SanicJinja2 instance is created without getting a circular import.

Do not render list object to html file

How to render object like this to html?
[{...}, {...} ..]

I wan't use for/while

Example:

{% for i in list %}
    {{ i }}
{% endfor %}

My code:

@app.route('/')
@jinja.template('index.html')
async def index(request):
    routes = generate_unique_routes()
    data = []
    for route in routes:
        data.append(json.loads(db.get(route)))
    return data

Error:
TypeError: unhashable type: 'list'

error occur when init sanic-jinja2:' ModuleNotFoundError: No module named '

there is my code :
from sanic import Sanic
from sanic import response
from sanic.response import text
from sanic.response import json
from sanic_jinja2 import SanicJinja2

app = Sanic("MyApp")
jinja = SanicJinja2()
jinja.init_app(app)

and this is result:
Traceback (most recent call last):
File "/root/.local/lib/python3.6/site-packages/pkg_resources/init.py", line 343, in get_provider
module = sys.modules[moduleOrReq]
KeyError: 'MyApp'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "server.py", line 12, in
jinja.init_app(app)
File "/usr/local/lib/python3.6/site-packages/sanic_jinja2/init.py", line 120, in init_app
pkg_name or app.name, pkg_path or "templates"
File "/root/.local/lib/python3.6/site-packages/jinja2/loaders.py", line 237, in init
provider = get_provider(package_name)
File "/root/.local/lib/python3.6/site-packages/pkg_resources/init.py", line 345, in get_provider
import(moduleOrReq)
ModuleNotFoundError: No module named 'MyApp'

Sanic can't live without a name

app = Sanic() session=Session(app,InMemorySessionInterface()) jinjia=SanicJinja2(app=app,session=session)

sanic.exceptions.SanicException: Sanic instance cannot be unnamed. Please use Sanic(name='your_application_name') instead.

If a name is given, the code will report an error

app = Sanic('test_app') session=Session(app,InMemorySessionInterface()) jinjia=SanicJinja2(app=app,session=session)

File "g:\web-test\app.py", line 8, in
jinjia=SanicJinja2(app=app,session=session)
File "G:\web-test.venv\lib\site-packages\sanic_jinja2_init_.py", line 100, in init
self.init_app(app, loader, pkg_name or app.name, pkg_path)
File "G:\web-test.venv\lib\site-packages\sanic_jinja2_init_.py", line 124, in init_app
loader = PackageLoader(
File "G:\web-test.venv\lib\site-packages\jinja2\loaders.py", line 287, in init
import_module(package_name)
File "C:\Python39\lib\importlib_init_.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "", line 1030, in _gcd_import
File "", line 1007, in _find_and_load
File "", line 984, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'test_app'

So the sample code can't be executed at all

sanic==21.12.1
sanic-jinja2==2022.1.13

How to use this in a Blueprint

Am using this for my sanic project and it’s great. I got it to run successfully if I initialized this on the app.py file. However, I can’t figure out how I might use it in a blueprint.

What I have right now:

app.py

app = Sanic(__name__)
app.static('/static', './cr/static')
jinja = SanicJinja2(app, line_statement_prefix='%', extensions=['jinja2_time.TimeExtension'])

blueprints/top_players.py

from ..app import jinja

bp_players = Blueprint("top_players")

@bp_players.route('/top/players')
async def top_players(request):
    client = crapipy.AsyncClient()
    data = await client.get_top_players()

    return jinja.render(
        'clan.html',
        request,
        title="Top Players",
        data=data
    )

I get an error saying:

ImportError: cannot import name 'jinja'

If I try to instantiate another instance inside the blueprint file:

jinja = SanicJinja2(bp_players, line_statement_prefix='%', extensions=['jinja2_time.TimeExtension'])

I get other errors. What can I do to make this work?

How to use FileSystemLoader as loader?

Hi, I have templates outside of app modules, I want to use FileSystemLoader from jinja2, but couldn't make it work with sanic-jinja2, can you help to take a look? below is what I've tried:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from sanic import Sanic
from sanic_jinja2 import SanicJinja2
from jinja2 import FileSystemLoader


app = Sanic()
jinja = SanicJinja2(app, loader=FileSystemLoader, pkg_path='/tmp/static')

@app.route('/')
async def index(request):
    return jinja.render('index.html', request)


if __name__ == '__main__':
    app.run(debug=True)

when access this is Exception:

AttributeError
'Environment' object has no attribute 'get_source'

Traceback (most recent call last):

File /tmp/app/env/lib/python3.5/site-packages/sanic/app.py, line 503, in handle_request

response = await response

File /usr/local/lib/python3.5/asyncio/coroutines.py, line 109, in __next__

return self.gen.send(None)

File app.py, line 13, in index

return jinja.render('index.html', request)

File /tmp/app/env/lib/python3.5/site-packages/sanic_jinja2/__init__.py, line 84, in render

return html(self.render_string(template, request, **context))

File /tmp/app/env/lib/python3.5/site-packages/sanic_jinja2/__init__.py, line 81, in render_string

return self.env.get_template(template).render(**context)

File /tmp/app/env/lib/python3.5/site-packages/jinja2/environment.py, line 830, in get_template

return self._load_template(name, self.make_globals(globals))

File /tmp/app/env/lib/python3.5/site-packages/jinja2/environment.py, line 804, in _load_template

template = self.loader.load(self, name, globals)

File /tmp/app/env/lib/python3.5/site-packages/jinja2/loaders.py, line 113, in load

source, filename, uptodate = self.get_source(environment, name)

AttributeError: 'Environment' object has no attribute 'get_source' while handling path /

i18n example

Hello,

This may be more related to how Jinja2 works in general but I couldn't figure out. What would be the best approach to using i18n with Sanic? For now I'm just creating multiple SanicJinja2 instances with different translations installed. E.g.

locale_dir = "locale"
translations_fi = Translations.load(locale_dir, 'fi')
translations_en = Translations.load(locale_dir, 'en')
JINJA_FI = SanicJinja2(app, extensions=['jinja2.ext.i18n'])
JINJA_EN = SanicJinja2(app, extensions=['jinja2.ext.i18n'])
JINJA_FI.env.install_gettext_translations(translations_fi)
JINJA_EN.env.install_gettext_translations(translations_en)

And then I use which ever matches the locale (which I'm determining elsewhere). This seems a bit silly approach. Do you have any suggestions how to approach this better?

Thanks!

sanic 22.6.2 is not supported?

from sanic_jinja2 import SanicJinja2
app = Sanic(name='MyApp')
session = Session(app, interface=InMemorySessionInterface())
jinja = SanicJinja2(app, app.name, pkg_name='app', pkg_path='templates',session=session)

@app.route('/card_test')
async def card_info(request):
    return jinja.render('card_info.html', request, title='卡密信息')  #可以直接渲染模板

TypeError: cannot create weak reference to 'str' object

sanic_jinja2 version 2022-01-13

Recent release creates very hard to debug errors

This commit cd1cb97 is incomplete. It is incomplete because when an app is calling init_app later in their code, it will not make aware of the default app_name argument being set to None.

Therefore it will pass None to the Jinja2 Loader which then throws a cryptic ImportError:

File "/media/ephemeral0/ben/app.aca9088a3a8cc36fc7bddd72ee32e56c12edc24c/app/__init__.py", line 83, in make_app
  jinja2_env.init_app(app)
File "/usr/local/lib/python3.6/site-packages/sanic_jinja2/__init__.py", line 31, in init_app
  loader = PackageLoader(pkg_name, 'templates')
File "/usr/local/lib/python3.6/site-packages/jinja2/loaders.py", line 224, in __init__
  provider = get_provider(package_name)
File "/usr/local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 435, in get_provider
  __import__(moduleOrReq)
TypeError: __import__() argument 1 must be str, not None

How is anyone going to debug this?

Suggested remediation:

  • Add an exception for this case (if app_name is None: raise ValueError('need an app name!'))

and/or

  • if app_name is None: app_name = app.name

Error after updating

Hello. I updated your library today, and I get an error when I run it: ValueError: __main__.__spec__ is None at jinja = SanicJinja2(app).
Installed libraries:

  • Jinja2==3.0.0
  • sanic==21.3.4
  • sanic-jinja2==0.10.0

Code:

from sanic import Sanic

app = Sanic(__name__)
jinja = SanicJinja2(app)


@app.route('/', methods=['GET', 'POST'])
async def index(request):
	return jinja.render('index.html', request)


if __name__ == '__main__':
	app.run(debug=True)

Jinja2 Extension — best way to set it up with sanic?

What is the recommended way to setup Jinja2 extension using this sanic extension? For example, I would like to enable the internationalization extension for jinaj2 here:

http://jinja.pocoo.org/docs/2.10/extensions/

Do I do it like this:

jinja = SanicJinja2(app, line_statement_prefix='%', extensions=['jinja2.ext.i18n'])

I’d be honest I just guess it this way by reading your source — but if you have a better suggestion I’d appreciate it.

Thanks!

Usage in other files/modules

Hello

Where do you suggest to store

jinja = SanicJinja2(app)

so it can be used in other modules/blueprints?

I would like to have something like

existent_jinja = sanic.jinja

Can't load the template

from sanic import Sanic
from sanic_jinja2 import SanicJinja2

app = Sanic(__name__)
jinja = SanicJinja2(app)
jinja.init_app(app)


@app.route('/')
@jinja.template('index.html')  # decorator method is staticmethod
async def index(request):
    return {'greetings': 'Hello, sanic!'}


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000, debug=True)

Output:

Traceback (most recent call last):
  File "F:/python/tortoise_demo/demo.py", line 5, in <module>
    jinja = SanicJinja2(app)
  File "D:\python375\Envs\test\lib\site-packages\sanic_jinja2\__init__.py", line 95, in __init__
    self.init_app(app, loader, pkg_name or app.name, pkg_path)
  File "D:\python375\Envs\test\lib\site-packages\sanic_jinja2\__init__.py", line 120, in init_app
    pkg_name or app.name, pkg_path or "templates"
  File "D:\python375\Envs\test\lib\site-packages\jinja2\loaders.py", line 286, in __init__
    spec = importlib.util.find_spec(package_name)
  File "d:\python375\lib\importlib\util.py", line 114, in find_spec
    raise ValueError('{}.__spec__ is None'.format(name))
ValueError: __main__.__spec__ is None

version:

sanic=21.6.0
sanic-jinja2=0.10.0

使用报错

AttributeError: module 'asyncio' has no attribute 'coroutine'. Did you mean: 'coroutines'?
image

[Question] Is session available in templates by default?

I've recently installed this package. except for blueprints (the only way I did get working this is using this approach), everything works good.

As the title say, is session available on templates?

For example:

@bp.route("/")
async def index(request):
    from app import jinja
    if request["session"].get("user"):
        user = request["session"].get("user")
        if user["role"] is "user":
            return jinja.render("home.html", request)
        else:
            return jinja.render("admin/home.html", request)
    else:
        return redirect("/login")
<section id="profile" class="profile">
            <figure>
                <img src="{{ session['user']['photo'] }}"/>
                <figcaption>{{ session["user"]["name"] }}</figcaption>
            </figure>
        </section>

Jinja erroring out

It seems just to be me as m friend tried the script and it worked perfectly fine,

Here is the code
`from sanic import Sanic
from sanic_session import Session, InMemorySessionInterface
from sanic_jinja2 import SanicJinja2

app = Sanic(name)

session = Session(app, interface=InMemorySessionInterface())
jinja = SanicJinja2(app, session=session)

@app.route('/')
@jinja.template('index.html') # decorator method is staticmethod
async def index(request):
jinja.flash(request, 'success message', 'success')
jinja.flash(request, 'info message', 'info')
jinja.flash(request, 'warning message', 'warning')
jinja.flash(request, 'error message', 'error')
jinja.session(request)["session key"] = "session value"
return {'greetings': 'Hello, sanic!'}

if name == 'main':
app.run(host='0.0.0.0', port=8000, debug=True)`

Here is the error
Traceback (most recent call last): File "C:\Path\", line 11, in <module> jinja = SanicJinja2(app, session=session) File "C:\Path\Python\Python38\lib\site-packages\sanic_jinja2\__init__.py", line 95, in __init__ self.init_app(app, loader, pkg_name or app.name, pkg_path) File "C:\Path\Python\Python38\lib\site-packages\sanic_jinja2\__init__.py", line 119, in init_app loader = PackageLoader( File "C:\Path\Python\Python38\lib\site-packages\jinja2\loaders.py", line 286, in __init__ spec = importlib.util.find_spec(package_name) File "C:\Path\Python\Python38\lib\importlib\util.py", line 114, in find_spec raise ValueError('{}.__spec__ is None'.format(name)) ValueError: __main__.__spec__ is None

TypeError: 'Request' object is not subscriptable when using flash function

Hi,

It seems like there is a bug when using Sanic version 20.12.1 (the latest version at this moment).

Everything works fine as long I am not using the flash messages functionality. As soon as I use this, I get the following error:

Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/sanic/app.py", line 914, in handle_request
    response = await response
  File "/usr/local/lib/python3.9/site-packages/sanic_jinja2/__init__.py", line 181, in wrapped
    context = yield from coro(*args, **kwargs)
  File "/frontend/frontend/blueprints/users.py", line 14, in foo
    request['flash']('success message', 'success')
TypeError: 'Request' object is not subscriptable

Add LICENSE

Please add a LICENSE file to the repository

sj(app)错误

不加pkg_name 报ValueError: main.spec is None;加了报ModuleNotFoundError: No module named '***'

This feature is not available for this version of Python

env: python3.5.2 sanic 0.3.1

hello

I get error when run this example

2017-03-02 22:36:38,197: ERROR: Exception occurred while handling uri: "/"
Traceback (most recent call last):
File "/usr/local/lib/python3.5/site-packages/sanic/sanic.py", line 329, in handle_request
response = await response
File "/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/lib/python3.5/asyncio/coroutines.py", line 105, in next
return self.gen.send(None)
File "/Users/mugbya/git/mine/sanic-jinja2/example/hello.py", line 34, in index
return await jinja.render('index.html', request, greetings='Hello, sanic!')
File "/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/lib/python3.5/asyncio/coroutines.py", line 105, in next
return self.gen.send(None)
File "/Users/mugbya/git/mine/sanic-jinja2/sanic_jinja2/init.py", line 54, in render
return html(await self.render_string(template, request, **context))
File "/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/lib/python3.5/asyncio/coroutines.py", line 105, in next
return self.gen.send(None)
File "/Users/mugbya/git/mine/sanic-jinja2/sanic_jinja2/init.py", line 51, in render_string
return await self.env.get_template(template).render_async(**context)
File "/usr/local/lib/python3.5/site-packages/jinja2/environment.py", line 1020, in render_async
raise NotImplementedError('This feature is not available for this '
NotImplementedError: This feature is not available for this version of Python

update_request_context is gone

In a recent update I see update_request_context() is not a member of SanicJinja2 class anymore but I really can't figure out how to use the context_processors parameter to update the context. My understanding is that that param is appended to the request_middlewares of the app, but I can't see how to update the context in a middleware as the context isn't accessible there. Any help?

Update for app.ctx?

Using this library with sanic 21.x gives these warnings:

 UserWarning: Setting variables on Sanic instances is deprecated and will be removed in version 21.9. You should change your Sanic instance to use instance.ctx.extensions instead.

I think it has to do with these:

app.jinja_env = self.env
app.enable_async = self.enable_async

Should require code changes to:

app.ctx.jinja_env = self.env
app.ctx.enable_async = self.enable_async

But I didn’t want to submit a PR because I am not sure if that’s the only thing that’s required. Hopefully you’ll find time to update this excellent plugin!

稍后初始化的情况下loader参数不生效

研究blueprint中使用这个库时发现一个bug:

jinja = SanicJinja2(
    loader=FileSystemLoader('templates')
    autoescape=select_autoescape(['html', 'xml']),
)
jinja.init_app(app)

然而这个loader参数没有生效, 下面这个才正常

jinja = SanicJinja2(
    autoescape=select_autoescape(['html', 'xml']),
)
jinja.init_app(app, loader=FileSystemLoader('templates'))

AttributeError: 'Sanic' object has no attribute 'ctx'

jinja2-sanic-code.py", line 10, in
session = Session(app, interface=InMemorySessionInterface())
/lib/python3.9/site-packages/sanic_session/init.py", line 21, in init
self.init_app(app, interface)
lib/python3.9/site-packages/sanic_session/init.py", line 25, in init_app
if not hasattr(app.ctx, "extensions"):
AttributeError: 'Sanic' object has no attribute 'ctx'

on just running basic example from home page

When creating a new release - make a new tag

When creating a new release, create a new tag. That makes it easier for developers to pick the version that they need if there happens to be incompatibilities.

It would also be nice if this was on pip.

How do I install jinja2 extension with this?

Specifically, I just tried to use jinja2-time with this and initialized with

from jinja2 import Environment
env = Environment(extensions=['jinja2_time.TimeExtension']) 

but that does not seem to do the trick. I am posting my issue here because I believe that this is related more about your extension being able to use jinja2 extensions.

Any help would be greatly appreciated. Thanks!

ModuleNotFoundError: No module named error

I am running the example that is in the project repository but it does not work.
Python version: 3.8.5

aiofiles==0.7.0
httptools==0.2.0
Jinja2==3.0.1
MarkupSafe==2.0.1
multidict==5.1.0
sanic==21.3.4
sanic-jinja2==0.10.0
sanic-routing==0.6.2
sanic-session==0.8.0
ujson==4.0.2
uvloop==0.15.2
websockets==8.1

imagen

Traceback (most recent call last):
  File "otra.py", line 9, in <module>
    jinja = SanicJinja2(app, session=session)
  File "/home/facundo/insumos/env_insumos/lib/python3.8/site-packages/sanic_jinja2/__init__.py", line 95, in __init__
    self.init_app(app, loader, pkg_name or app.name, pkg_path)
  File "/home/facundo/insumos/env_insumos/lib/python3.8/site-packages/sanic_jinja2/__init__.py", line 119, in init_app
    loader = PackageLoader(
  File "/home/facundo/insumos/env_insumos/lib/python3.8/site-packages/jinja2/loaders.py", line 285, in __init__
    import_module(package_name)
  File "/usr/lib/python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 973, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'asd'

Custom the path of template folder

My templates not in the app/templates, but app/cms/templates.
So I import the PackageLoader from the jinja2.
Would you support to custom the path?

from jinja2 import PackageLoader
from sanic_jinja2 import SanicJinja2

# Jinja2 template engine
template_package_loader = PackageLoader(app.name, 'cms/templates')
template = SanicJinja2(app, loader=template_package_loader)

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.