How to redirect to static content inside a controller (Turbogears and Angular2

43 views
Skip to first unread message

Juparave

unread,
Aug 31, 2016, 1:09:10 PM8/31/16
to TurboGears
I'm developing a simple online catalog using Turbogears as backend to an Angular app.

The structure is very simple, you can look at my seed project https://bitbucket.org/juparave/turboangular

The app runs very smooth and well.  But, it has come to my attention that, using Angular's HashLocationStrategy google is unable to parse content.

My design uses a catalog_controller.py which only renders index, from there Angular takes over, having urls like '/catalog#/category/443435523daf321f123123sfaf1234'


class CatalogController(BaseController):
    # Uncomment this line if your controller requires an authenticated user
    # allow_only = predicates.not_anonymous()

    @expose()
    def _default(self, *args):
        site_dir = os.path.join(config.get('here'), '/catalogapp/public')

        return StaticURLParser(site_dir)(tg.request)
        # return WSGIAppController(StaticURLParser(site_dir)), args

    @expose('bodegagourmet.templates.catalog')
    def index(self, **kw):
        return dict(page='catalog-index')


I'm trying to use the new Angular routing systems which no longer requires hashes, but now all those links are intercepted by TG controllers, returning 404's everywhere.  

I also tried returning static content using the example in this post https://groups.google.com/forum/#!topic/turbogears/OPFJVLpGi6s but also returns 404.

My question is, where to tell TG to ignore requests beyond a controller?

I mean, I'm looking for TG to ignore all requests from /catalog/ (except, maybe for index)

Thanks

Alessandro Molina

unread,
Sep 1, 2016, 3:19:11 AM9/1/16
to TurboGears
I think I didn't understand which exactly is the problem, you mentioned three different things :D

- If your URLS are all like /catalog#/category/443435523daf321f123123sfaf1234 the only endpoint TG will see is /catalog so they should all be served by index. So how can it be returning 404?
- Do you have an example that I can download to reproduce the problem?
If you need to return static content anything you put into the "public" directory of your app will be directly available, usually the only reason to roll your own static serving is for pluggable/reusable components as those are not inside the same app that user will run.

Regarding how to tell TG to "ignore requests" can you explain what you mean by "ignoring"? If TG receives a request it's because the browser sent it to the server, so at that point the server must return some kind of response. What kind of response do you expect to return? As we are talking of a SPA I suppose what you mean for ignoring is that it should be managed by angular and not TG, which means that your browser shouldn't be sending any request as Angular should have trapped it and never let it reach the server.

I'm not an angular guy but If you can try to provide an example that showcases the actual situation and problem I'll gladly try help you :D

--
You received this message because you are subscribed to the Google Groups "TurboGears" group.
To unsubscribe from this group and stop receiving emails from it, send an email to turbogears+unsubscribe@googlegroups.com.
To post to this group, send email to turbo...@googlegroups.com.
Visit this group at https://groups.google.com/group/turbogears.
For more options, visit https://groups.google.com/d/optout.

Juparave

unread,
Sep 2, 2016, 8:05:54 PM9/2/16
to TurboGears
Hi Alessandro,

You're right, I guess I wasn't clear explaining my problem.   When my Angular2 app uses HashLocationStrategy the request doesn't get to TG, but, neither does Google bots, url's like /catalog#/category/443435523daf321f123123sfaf1234 get ignore past the '#'

So I needed to change to the new routing strategy, which doesn't use hash anymore.  Then TG was trying to assign a controller to the URL being asked by the browser.

I was fool thinking that I needed to return a static file, when in fact I needed to return nothing.  So in a moment of pure inspiration, =), I did exactly that, returned 'nothing' but an empty dict.

class CatalogController(BaseController):
# Uncomment this line if your controller requires an authenticated user
# allow_only = predicates.not_anonymous()

    @expose('bodegagourmet.templates.catalog')
def _default(self, *args):

return dict()


@expose('bodegagourmet.templates.catalog')
def index(self, **kw):
return dict(page='catalog-index')


Success, my app now works wonderful with TG as backend.

Thank you Alessandro 
To unsubscribe from this group and stop receiving emails from it, send an email to turbogears+...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages