My Wiki!

Starting django Working Tutorials Serie

Preparing workspace

Create an isolated python env

  
  virtualenv --no-site-packages pjs_env
  source ./pjs_env/bin/activate
  pip install django
  pip install django-cms
  which django-admin.py
 

Image Support

Install JPEG support on host (outside virtualenv!):

sudo yum install python-devel libjpeg-devel freetype-devel libpng-devel
sudo yum install mysql-devel mysql-common mysql-libs    

Reinstall Pillow

pip install -I Pillow    

Mysql-python

  pip install mysql-python
  
  

Posgre Database

Install postgresql and postgresql-server packages:

dnf install postgresql postgresql-server python-psycopg2
dnf install postgresql-server postgresql-devel postgresql-contrib
vir_env> pip install psycopg2

Installation issues

When installing specific version (9.4.4) from repo, e.g., configured with ansible. psql links with older libpq.

   The libpq being found on the library path (/etc/ld.so.conf and LD_LIBRARY_PATH) is older than the version in 9.4. Use ldd /usr/lib/postgressql/9.4/bin/psql to find out which version is being linked to. – Craig Ringer Jan 24 '15 at 9:19 

Check installation:

dnf list installed | grep postgres
postgresql.x86_64                      9.5.4-1.fc24                     @updates
postgresql-contrib.x86_64              9.5.4-1.fc24                     @updates
postgresql-devel.x86_64                9.5.4-1.fc24                     @updates
postgresql-libs.x86_64                 9.5.4-1.fc24                     @updates
postgresql-server.x86_64               9.5.4-1.fc24                     @updates
postgresql94.x86_64                    9.4.9-1PGDG.f24                  @pgdg94 
postgresql94-contrib.x86_64            9.4.9-1PGDG.f24                  @pgdg94 
postgresql94-libs.x86_64               9.4.9-1PGDG.f24                  @pgdg94 
postgresql94-server.x86_64             9.4.9-1PGDG.f24                  @pgdg94 

Configure PostgresSQL:

The database initialization could be done using following command. It creates the configuration files postgresql.conf and pg_hba.conf

sudo postgresql-setup initdb

When install from package: Initialize Cluster with initdb Command

su - postgres -c /usr/pgsql-9.4/bin/initdb

Set PostgreSQL Server to Listen Addresses and Set Port.

  /var/lib/pgsql/data/postgresql.conf

Uncomment this two line:

listen_addressses = ‘ ‘
port = 5432

or

listen_addresses=’localhost’

Set PostgreSQL Permissions (pg_hba.conf )

# Local networks
host	all	all	        xx.xx.xx.xx/xx	md5
# Example
host	all	all     	10.20.4.0/24	md5
# Example 2
host	test	testuser	127.0.0.1/32	md5

Start PostgreSQL Server and Autostart PostgreSQL on Boot

Start PostgreSQL Server:

## Start PostgreSQL 9.4 ##
systemctl start postgresql-9.4.service
 
## Start PostgreSQL 9.4 on every boot ##
systemctl enable postgresql-9.4.service

Configuring Postgresql

Setting up Postgres Users

Changing the postgres users database password:

su postgres

and then run postgre's interactive shell:

psql
psql (9.3.2)
Type "help" for help.

postgres=#

It might be good idea to add password for postgres user:

postgres=# \password postgres

Lets get back to user creation:

postgres=# CREATE USER lenny WITH PASSWORD 'leonard';
postgres=# CREATE DATABASE carl OWNER lenny;

Type \q and then press ENTER to quit psql.

List users:

\deu[+] [PATTERN] such as :
postgres=# \deu+

And for all users:

  postgres=# \du 

User management:

  postgres=# DROP ROLE username;
  postgres=# CREATE USER alice WITH PASSWORD 'pAssw0rd';
  

Other commons:

  \list or \l: list all databases
  \dt: list all tables in the current database
  \connect database_name

This could be done from system shell too:

$ createuser lenny
$ createdb --owner=lenny carl
createuser - define a new PostgreSQL user account
dropuser - remove a PostgreSQL user account

Configuration

The postgresql server is using two main configuration files

/var/lib/pgsql/data/postgresql.conf
/var/lib/pgsql/data/pg_hba.conf 

Changing the postgres user OS password:

sudo passwd -d postgres

sudo su postgres -c passwd

Allow user create database

psql 
psql (9.4.4)
Type "help" for help.

postgres=# \l
                                   List of databases
   Name    |    Owner    | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+-------------+----------+-------------+-------------+-----------------------
 postgres  | postgres    | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | postgres    | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |             |          |             |             | postgres=CTc/postgres
 template1 | postgres    | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |             |          |             |             | postgres=CTc/postgres
 vfossdb   | vfossdbuser | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
(4 rows)

postgres=# ALTER USER vfossdbuser CREATEDB;

Working with Postgre

Drop database

  DROP DATABASE [ IF EXISTS ] name;
  

Select database

Connect to the testdb database:

  postgres=# \c testdb;

You can select your database from command prompt itself at the time when you login to your database. Following is the simple example:

  psql -h localhost -p 5432 -U postgress testdb

Password for user postgress:

Create Table

Basic syntax of CREATE TABLE statement is as follows:

CREATE TABLE table_name(
   column1 datatype,
   column2 datatype,
   column3 datatype,
   .....
   columnN datatype,
   PRIMARY KEY( one or more columns )
);

Used to list down all the tables in an attached database.

testdb-# \d

Use \d tablename to describe each table as shown below:

testdb-# \d company

Drop Table

  DROP TABLE table_name;
  

Headline

Configure Django Settings

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'dbname',
        'USER': 'postgres',
        'PASSWORD': 'postgres',
        'HOST': '',
        'PORT': '',
    }
}

Install additional packages

Start A Django Project

Setup project

  django-admin.py startproject myproject
  

Database Migrations

Setup Database

Fedora 21

  yum install mariadb-server.x86_64 mariadb-devel.x86_64
  systemctl start mysqld.service
  systemctl enable mysqld.service

Create DB, Users

  sudo su
  mysql
  CREATE DATABASE djangodb;
  GRANT ALL ON djangodb.* TO djangouser@localhost IDENTIFIED BY 'djangouser';
  exit
  
  mysql -u djangouser -p djangodb

See more: https://www.linux.com/learn/tutorials/793758-mariadb-practical-how-to-for-linux-admins

DB init script

cat scripts/mysql_init.sh 
#!/bin/bash
 
EXPECTED_ARGS=3
E_BADARGS=65
MYSQL=`which mysql`
 
Q1="CREATE DATABASE IF NOT EXISTS $1;"
Q2="GRANT ALL ON *.* TO '$2'@'localhost' IDENTIFIED BY '$3';"
Q3="FLUSH PRIVILEGES;"
SQL="${Q1}${Q2}${Q3}"
 
if [ $# -ne $EXPECTED_ARGS ]
then
  echo "Usage: $0 dbname dbuser dbpass"
	echo "Default args used: $0 inhanoidb inhanoidbuser inhanoidbuser"

	Q1="CREATE DATABASE IF NOT EXISTS inhanoidb;"
	Q2="GRANT ALL ON *.* TO 'inhanoidbuser'@'localhost' IDENTIFIED BY 'inhanoidbuser';"
	Q3="FLUSH PRIVILEGES;"
	SQL="${Q1}${Q2}${Q3}"
  #exit $E_BADARGS
fi
 
#$MYSQL -uroot -p -e "$SQL"
$MYSQL -uroot  -e "$SQL"

Database Engine

  vim settings.py
  
DATABASES = { 
    'default': {
        #'ENGINE': 'django.db.backends.sqlite3',
        #'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': '127.0.0.1',
        #'PORT': '5432',
        }
    } 

Djagno DB

South is built-in to Django > 1.7. This is optional if 1.7 is used.

  pip install south
  

Add south to settings.INSTALLED_APP

  python manage.py syncdb
  # admin refmanadmin

For Django > 1.7 simply do this AFTER creating models

  python manage.py makemigrations
  python manage.py migrate

Generate requirements.txt

 mkdir requirement
 pip freeze > requirement/requirements.txt
 

Creating App

  python manage.py startapp myapp
  

Add it to settings.INSTALLED_APP

Create Model

Refer to next tutorial for working with models.

Track Changes to Model

Create migration for current model. Changes to the model will be saved in a file, e.g., myapp/migrations/0001_initial.py.

  python manage.py makemigrations myapp
  

To see what will happen with the database if the migration is applied, use the sqlmigrate command takes migration names and returns their SQL:

  python manage.py sqlmigrate myapp 0001

run migrate again to create those model tables in your database:

python manage.py migrate

Depricated

Tell south to track myapp:

  python manage.py schemamigration myapp --initial

With Django > 1.7 just migrate is enough.

  python manage.py migrate
   

This creates tables in the database for all apps in INSTALLED_APPS.

Migrate DB changes:

  $ python manage.py migrate myapp
  

Mark current migration point:

  python manage.py makemigrations
  

Django-cms

Useful Commands

Check setup

  ./manage.py cms check

Remove app

  ./manage.py migrate app_name zero    
  

Check pip

  pip check

Navigation