How to profile an AJAX endpoint in Flask? - flask

To profile a GET endpoint in Flask, I've been using the Line Profile Panel for Flask Debug Toolbar.
This doesn't work on AJAX/XHR endpoints though. I've also tried line_profiler but it doesn't play nice with Flask.

Martijn Pieters' comment is correct. You can use Flask-Debug-API together with the Line Profiler Panel (https://github.com/jlfwong/flask_debugtoolbar_lineprofilerpanel).
Once both are added to your code, then you can navigate through the API Browser to the endpoint you want to test, submit a request to it, then you will have access to the results of the line profiler.

Related

Django rest framework Reactjs sessions not working

So I have set up Django rest framework as a backend API for an e-commerce website. The website is displayed through a React frontend, which is not served by the django backend.
I am currently running both the Django backend and the React frontend from their local development servers (http://127.0.0.1:8000 and http://127.0.0.1:3000 respectively). In the future they will be on separate domains, probably.
When I set a session in a view, and read the content in another, this works if I just type in the urls for creating and reading directly into my browser (just for testing purposes). But when I access the backend through my frontend, sessions can not be accessed anymore, or don't seem stored. What will happen is that I get a KeyError when trying to access the data that I set in a previous view.
I guess this has to do with something I have read about some time ago, but I find it hard to find the correct information on how to work with this. Does this have to do with the cookie with the session id not being available to the frontend, but only to the backend itself?
Main question:
I would like to know how I can work with sessions, using the above settup, for keeping a shopping cart.
My backend code, just in case someone wonders:
from django.http import HttpResponse
def cart_add(request, product_id, update, quantity):
request.session['one'] = 'created through "cart_add" view'
return HttpResponse("Created a session - cart_add")
def create(request):
request.session['one'] = 'created through "read" view'
return HttpResponse("Created a session - create")
def read(request):
print(request.session['one'])
I have removed some unnecessary code.
The cart_add view is called from the React frontend, using an ajax call (axios).
The create and the read view I called by typing their urls directly into the browser.
(This is all done for testing purposes, just making sure sessions are working before I start to write the real code.)
I've found a solution in another stackoverflow question. This is the link to it.
By adding the following to my axios request, the code works successfully:
axios.get('some api url', {withCredentials: true});
So it seems my assumption about the cookie with the session id not being available to the frontend is incorrect.
I also found out that I could see the cookie by opening the web page in Chrome, then opening the developer tools > going to 'application' tab > click on cookies.
Here all the available cookies are listed, and also a sessionid cookie is shown.
I had the same issue, by adding withCredentials in axios call didn't solve my problem in django 2.2.3 and axios 0.19.0.
If the answer here doesn't work for you, then look into the below answer :)
React Django REST framework session is not persisting/working

How to run Django views from a script?

I am writing a Django management command that visits a few pages, logged in as a superuser, and saves the results to a set of .html files.
Right now I'm just using the requests library and running the command with the development server running. Is there an easy way to generate the HTML from a view response so I do without actual HTTP requests?
I could create a request object from scratch but that seems like more overhead than the current solution. I was hoping for something simple.
Django has a RequestFactory which seems to suit your needs.
While it's not exactly meant for this purpose, an option would be to use the testing framework's Client to fake a request to the url - be sure to use client.login() before making your requests, to ensure you have superuser capabilities.

How to register users using django-rest-framework and angularJS?

I have a project where am developing a Django single page web app using angularJS and now, All calls between the front and back end should be done via Django-REST.
Am now doing the registration and I cant seem to figure out exactly what should be done
I saw This Post and I was wondering when I fill the sign up form in the front end, how will it be send using rest and save the user. Any help, links on how to go about it will be much appreciated. Thanks
You create a service myService that will give you $resource(yourEndpointUrlForUsers) and then save the data using myService.save(dataFromForm).
Try this django app - https://github.com/sunscrapers/djoser.
And normal http requests from the fronted controllers to the urls in this app will work.

Django Not Permitting POSTs From Google Web Toolkit

I'm trying to get Google Web Toolkit to work with Django through GETs and POSTs, following the examples here. When GWT sends a POST, however, Django sends back an HTTP 403.
My question is then, is Django set up to not receive POSTs? Is there some setting I need to change? Or is there something wrong with the way GWT is sending the POST?
The GET is working either, if anyone also knows something about that.
From django1.2, views are csrf protected.
If you want to csrf exempt any view use csrf_exempt decorator

Django - How do I redirect ie6?

I want to send a user to a page on my site that prompts him to upgrade to a more recent browser if they are using ie6 or lower.
How can this be achieved in Django?
You want to use Middleware. Specifically, you want to sniff the browser agent in the process_request of your middleware, and return a HttpResponseRedirect if the browser agent indicates IE6.
There's a snippet that should get you started here. Do post a comment if you need help with it!