analitics

Pages

Monday, April 29, 2019

Python 3.7.3 : Get location of International Space Station.

Today I tested the urllib python module with python 3.7.3 and json python module.
The issue was to get the location of International Space Station - Open Notify.
The International Space Station is moving at close to 28,000 km/h so its location changes really fast! Where is it right now?
This is an open source project to provide a simple programming interface for some of NASA’s awesome data.
I do some of the work to take raw data and turn them into APIs related to space and spacecraft.
C:\Python373>python.exe
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD6
4)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import urllib.request
>>> with urllib.request.urlopen('http://api.open-notify.org/iss-now.json') as f:
        print(f.read(300))
...
b'{"iss_position": {"longitude": "-86.9247", "latitude": "-38.3744"}, "message":
 "success", "timestamp": 1556575039}'
>>> with urllib.request.urlopen('http://api.open-notify.org/iss-now.json') as f:
...     source = f.read()
...     data = json.loads(source)
...
>>> print(data)
{'iss_position': {'longitude': '151.1941', 'latitude': '49.4702'}, 'message': 's
uccess', 'timestamp': 1556578621}
>>> print(data['iss_position']['longitude'])
151.1941
>>> print(data['iss_position']['latitude'])
49.4702
>>> print(data['message'])
success

Sunday, April 28, 2019

Python 3.7.3 and memory_profiler python module.

Today I will come up with a simpler and more effective tutorial in python programming.
First, I need to install the psutil python module for the example of this tutorial.
C:\Python373>cd Scripts
C:\Python373\Scripts>pip install psutil
Python memory monitor is very important for debugging application performance and fix bugs.
You can solve this issue is the python module named memory_profiler, see more here.
Let's install this python module with the pip python tool:
C:\Python373\Scripts>pip install memory_profiler
Let's start with a simple python script example:
import psutil

def test_psutil():
 # gives a single float value
 print(psutil.cpu_percent())
 # gives an object with many fields
 print(psutil.virtual_memory())
 # you can convert that object to a dictionary 
 print(dict(psutil.virtual_memory()._asdict()))
if __name__ == '__main__':
 test_psutil()

C:\Python373>python psutil_001.py
0.0
svmem(total=4171108352, available=1153679360, percent=72.3, used=3017428992, fre
e=1153679360)
{'total': 4171108352, 'available': 1153671168, 'percent': 72.3, 'used': 30174371
84, 'free': 1153671168}
The same result can see if you use memory_profiler
C:\Python373>python -m memory_profiler psutil_001.py
100.0
svmem(total=4171108352, available=1149018112, percent=72.5, used=3022090240, fre
e=1149018112)
{'total': 4171108352, 'available': 1149087744, 'percent': 72.5, 'used': 30220206
08, 'free': 1149087744}
Let's decorate python source code with @profile annotation to have a good output.
import psutil
@profile
def test_psutil():
 # gives a single float value
 print(psutil.cpu_percent())
 # gives an object with many fields
 print(psutil.virtual_memory())
 # you can convert that object to a dictionary 
 print(dict(psutil.virtual_memory()._asdict()))
if __name__ == '__main__':
 test_psutil()

Sure, this error tells us the decorate not working in the default way.
C:\Python373>python psutil_001.py
Traceback (most recent call last):
  File "psutil_001.py", line 2, in 
    @profile
NameError: name 'profile' is not defined
In this case, the decorate profile works great with the python module and give us all the information we need:
C:\Python373>python -m memory_profiler psutil_001.py
100.0
svmem(total=4171108352, available=1022672896, percent=75.5, used=3148435456, fre
e=1022672896)
{'total': 4171108352, 'available': 1022783488, 'percent': 75.5, 'used': 31483248
64, 'free': 1022783488}
Filename: psutil_001.py

Line #    Mem usage    Increment   Line Contents
================================================
     2   15.219 MiB   15.219 MiB   @profile
     3                             def test_psutil():
     4                                  # gives a single float value
     5   15.230 MiB    0.012 MiB        print(psutil.cpu_percent())
     6                                  # gives an object with many fields
     7   15.230 MiB    0.000 MiB        print(psutil.virtual_memory())
     8                                  # you can convert that object to a dicti
onary
     9   15.234 MiB    0.004 MiB        print(dict(psutil.virtual_memory()._asdi
ct()))
Let's test with another python script named 001.py :
from memory_profiler import profile

@profile(precision=4)
def test():
    a = 0
    a = a + 1

if __name__ == "__main__":
    test()
The result with precision=4 is this:
C:\Python373>python -m memory_profiler 001.py
Filename: 001.py

Line #    Mem usage    Increment   Line Contents
================================================
     3  15.3945 MiB  15.3945 MiB   @profile(precision=4)
     4                             def test():
     5  15.3945 MiB   0.0000 MiB       a = 0
     6  15.3945 MiB   0.0000 MiB       a = a + 1
If we change the precision=1 then this is the result:
C:\Python373>python -m memory_profiler 002.py
Filename: 002.py

Line #    Mem usage    Increment   Line Contents
================================================
     3     15.4 MiB     15.4 MiB   @profile(precision=1)
     4                             def test():
     5     15.4 MiB      0.0 MiB       a = 0
     6     15.4 MiB      0.0 MiB       a = a + 1
A good source of information for this python module can be found at GitHub.

Saturday, April 27, 2019

Django REST framework - part 001.

Today I will introduce you a tutorial to fix some of the necessary elements presented in the old tutorial.
The manage tool shell can also give us some info:
C:\Python373\Scripts\example>python manage.py shell
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD6
4)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from test001.models import test
>>> from django.db.models import Count, Min, Max, Avg
>>> out = test.objects.all
>>> out
...
One note about error method, do not use like this:
>>> out = test.objects.all
>>> out[0]
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'method' object is not subscriptable
The correct way method is:
>>> out = test.objects.all()
>>> out
]>
>>> out[0]

>>> vars(out[0])
{'_state': , 'id'
: 1, 'first_name': 'Cătălin George', 'last_name': 'Feștilă'}
We can use the annotate.
This issue can solve it into this way:
>>> minimal = test.objects.annotate(Min('last_name'))
>>> minimal
]>
>>> minimal[0]

>>> vars(minimal[0])
{'_state': , 'id'
: 1, 'first_name': 'Cătălin George', 'last_name': 'Feștilă', 'last_name__min': '
Feștilă'}
See the result of the annotate add the last_name__min value.
I created another class named city with just one field named city_name and I fill with one value:
All changes are posted at the end of this tutorial.
Let's test with the shell some of these new changes:
C:\Python373\Scripts\example>python manage.py shell
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit 
(AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from test001.models import test,city
>>> from django.db.models import Count, Min, Max, Avg
>>> out_test = test.objects.all()
>>> out_city = city.objects.all()
>>> out_test
]>
>>> out_city
]>
>>> vars(out_city[0])
{'_state': , 'id'
: 1, 'city_name': 'Fălticeni'}
We can easy test the new example:
>>> minimal = test.objects.annotate(Min('last_name'))
>>> minimal
]>
>>> vars(minimal[0])
{'_state': , 'id'
: 1, 'first_name': 'Cătălin George', 'last_name': 'Feștilă', 'last_name__min': '
Feștilă'}
>>> minimal = city.objects.annotate(Min('city_name'))
>>> minimal
]>
>>> vars(minimal[0])
{'_state': , 'id'
: 1, 'city_name': 'Fălticeni', 'city_name__min': 'Fălticeni'}
>>> filter_test = test.objects.filter(id = 1)
>>> vars(filter_test)
{'model': , '_db': None, '_hints': {}, 'query': 
, '_result_cache': 
None, '_sticky_filter': False, '_for_write': False, '_prefetch_related_lookups':
(), '_prefetch_done': False, '_known_related_objects': {}, '_iterable_class': , '_fields': None}
>>> vars(filter_test[0])
{'_state': , 'id'
: 1, 'first_name': 'Cătălin George', 'last_name': 'Feștilă'}
Feel free to test with my old and the new example:
# models.py
from django.db import models

class test(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    
class city(models.Model):
    city_name = models.CharField(max_length=30)
#admin.py
from django.contrib import admin
from .models import test, city
admin.site.register(test)
admin.site.register(city)
#serializers.py
from rest_framework import serializers
from .models import test, city

class test_serializer(serializers.ModelSerializer):
    class Meta:
        model = test
        fields = ('id', 'first_name', 'last_name')

class city_serializer(serializers.ModelSerializer):        
    class Meta:
        model = city
        fields = ('id', 'city_name')
#views.py
from django.shortcuts import render
from rest_framework import viewsets
from .models import test, city
from .serializers import test_serializer, city_serializer

class test_view(viewsets.ModelViewSet):
    #query to get all information from database
    queryset = test.objects.all()
    serializer_class = test_serializer

class city_view(viewsets.ModelViewSet):
    #query to get all information from database
    queryset = city.objects.all()
    serializer_class = city_serializer
#urls.py
from django.urls import path, include
from . import views
from rest_framework import routers

router = routers.DefaultRouter()
router.register('test001', views.test_view)
router.register('city', views.city_view)
#add to path 
urlpatterns = [
    path('', include(router.urls))
]

Friday, April 26, 2019

Python 3.7.3 and Django REST framework.

Today I tested something simpler for beginners: Django REST framework.
Once you understand how it works then it's simple to use.
This tutorial does not address the security issues generated by the REST, Django framework.
The official webpage comes with many information and technical specifications for this API:
Django REST framework is a powerful and flexible toolkit for building Web APIs.
The example I've submitted is built into the Scripts folder because I did not use the virtual environment.
Let's start installing the python module.
C:\Python373\> cd Scripts
C:\Python373\Scripts\>pip install djangorestframework
C:\Python373\Scripts\>django-admin startproject example
C:\Python373\Scripts\>cd example 
C:\Python373\Scripts\>python manage.py migrate 
C:\Python373\Scripts\>python manage.py createsuperuser
C:\Python373\Scripts\>python manage.py startapp test001
In the example folder we will make changes.
First is the settings.py file:
INSTALLED_APPS = [
...
    'rest_framework',
    'test001']
The next file is the urls.py:
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('test001.urls'))
]
Also make changes in the test001 folder
You must create a python script and call it urls.py:
from django.urls import path, include

# this urlpatterns will fill later 
urlpatterns = []
You make changes to the file models.py and create a named class test.
This class will have two fields that we will update.
from django.db import models

class test(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
44/5000
The following commands will synchronize the database:
C:\Python373\Scripts\example>python manage.py makemigrations
...
  test001\migrations\0001_initial.py
    - Create model test
C:\Python373\Scripts\example>python manage.py migrate
...
Running migrations:
...
Another step is to add the test into admin.py script:
from django.contrib import admin
from .models import test
admin.site.register(test)
Serializers allow complex data such as querysets and model instances to be converted to native Python datatypes that can then be easily rendered into JSON , XML or other content types.
Let's create an serializers.py python script into test001 folder and use this code:
from rest_framework import serializers
from .models import test

class test_serializer(serializers.ModelSerializer):
    class Meta:
        model = test
        fields = ('id', 'first_name', 'last_name')
Also is need to update the views.py python script:
from django.shortcuts import render
from rest_framework import viewsets
from .models import test
from .serializers import test_serializer

class test_view(viewsets.ModelViewSet):
    #query to get all information from database
    queryset = test.objects.all()
    serializer_class = test_serializer
Now because is all create the last step is to fix the urls.py from test001 folder with the routers.
The REST framework adds support for automatic URL routing to Django.
from django.urls import path, include
from . import views
from rest_framework import routers

router = routers.DefaultRouter()
router.register('test001', views.test_view)
#add to path 
urlpatterns = [
    path('', include(router.urls))
]
Now you can test it with:
C:\Python373\Scripts\example>python manage.py runserver
If you want to make changes into models.py then you will need to use the commands to synchronize the database after these use"commands
makemigrations and migrate to fix errors.
If you encounter such run-time errors
"GET /static/assets/js/docs.min.js HTTP/1.1" 404 1667..."
These errors can be the result of settings like DEBUG, STATICFILES_DIRS or STATIC_ROOT from file settings.py.
Then you need to execute python manage.py collectstatic and Django goes through all directories where static files can be found and places them in your static root.
The result of this tutorial can be see on my youtube channel:

Wednesday, April 24, 2019

Google's Python Class - another step.

Here's something I like and I hope it should be known in the Python community.
Some people from Google want to attract the python community into a learning process.
Although most of the API documentation examples do not exist in the Python programming language, they have not disappeared.
Let's hope this little step will increase the chances of programming Google with the Python programming language.
This material was created by Nick Parlante working in the engEDU group at Google.
Welcome to Google's Python Class -- this is a free class for people with a little bit of programming experience who want to learn Python. The class includes written materials, lecture videos, and lots of code exercises to practice Python coding. These materials are used within Google to introduce Python to people who have just a little programming experience. The first exercises work on basic Python concepts like strings and lists, building up to the later exercises which are full programs dealing with text files, processes, and http connections. The class is geared for people who have a little bit of programming experience in some language, enough to know what a "variable" or "if statement" is. Beyond that, you do not need to be an expert programmer to use this material.
Read more about this course here.