Skip to content

Instantly share code, notes, and snippets.

@sademidenko
Last active December 4, 2017 15:16
Show Gist options
  • Save sademidenko/128b0b2914fa4e554d933de3aec72216 to your computer and use it in GitHub Desktop.
Save sademidenko/128b0b2914fa4e554d933de3aec72216 to your computer and use it in GitHub Desktop.
Смешанное занятие №2
@sademidenko
Copy link
Author

sademidenko commented Mar 13, 2017

1. Создание директории проекта ask_pupkin

Установка менеджера пакетов для питона

  $ sudo apt-get install python-pip

Установка оболочки для вашего проекта

  $ sudo pip install virtualenvwrapper  
  $ source /usr/local/bin/virtualenvwrapper.sh  
  $ mkvirtualenv tp-env  

Войти в окружение

  $ workon tp-env # м.б. стоит выполнить  source /usr/local/bin/virtualenvwrapper.sh если нет workon

Установка Django

  (tp-env) $ pip install Django

Создание проекта

  (tp-env) $ mkdir -p ~/Projects
  (tp-env) $ cd ~/Projects
  (tp-env) $ django-admin startproject ask_sdemidenko

2. Настройка gunicorn для запуска WSGI скриптов

  (tp-env) $ pip install gunicorn
  (tp-env) $ cd ~/Projects/ask_sdemidenko
  (tp-env) $ gunicorn ask_sdemidenko.wsgi

3. Создание простой WSGI скрипт

Файс wsgi.py

def simple_app(environ, start_response):
    """Simplest possible application object"""
    status = '200 OK'
    response_headers = [('Content-type', 'text/plain')]
    start_response(status, response_headers)
    return ['Hello world!\n']


class AppClass:
    """Produce the same output, but using a class

    (Note: 'AppClass' is the "application" here, so calling it
    returns an instance of 'AppClass', which is then the iterable
    return value of the "application callable" as required by
    the spec.

    If we wanted to use *instances* of 'AppClass' as application
    objects instead, we would have to implement a '__call__'
    method, which would be invoked to execute the application,
    and we would need to create an instance for use by the
    server or gateway.
    """

    def __init__(self, environ, start_response):
        self.environ = environ
        self.start = start_response

    def __iter__(self):
        status = '200 OK'
        response_headers = [('Content-type', 'text/plain')]
        self.start(status, response_headers)
        yield "Hello world!\n"

Пример запуска wsgi.py с функцией simple_app

  $ gunicorn wsgi:simple_app

Или для запуска класса AppClass

$ gunicorn wsgi:AppClass

4. Реализовать пункт 3 с помощью django

Создадим app

  (tp-env) $ python manage.py startapp questions

Проект

(tp-env) ➜  ask_sdemidenko cat /home/user4/Projects/ask_sdemidenko/ask_sdemidenko/urls.py
from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'question/', include('questions.urls')),

    url(r'^admin/', admin.site.urls),
]
(tp-env) ➜  ask_sdemidenko cat /home/user4/Projects/ask_sdemidenko/questions/urls.py
from django.conf.urls import url

from questions.views import AboutView

urlpatterns = [
    url(r'^about$', AboutView.as_view(), name='about'),
]
(tp-env) ➜  ask_sdemidenko cat /home/user4/Projects/ask_sdemidenko/questions/views.py
from django.views.generic import TemplateView


class AboutView(TemplateView):
    template_name = "about.html"
(tp-env) ➜  ask_sdemidenko cat /home/user4/Projects/ask_sdemidenko/questions/templates/about.html
<p> Hello, Jack the dog</p>

Структура, которая у нас получилась

➜  user17 ~ cd ~/Projects/ask_sdemidenko 
➜  user17 ask_sdemidenko tree
├── ask_sdemidenko
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── db.sqlite3
├── manage.py
└── questions
    ├── admin.py
    ├── apps.py
    ├── __init__.py
    ├── migrations
    │   └── __init__.py
    ├── models.py
    ├── templates
    │   └── about.html
    ├── tests.py
    ├── urls.py
    └── views.py

5. Настройка nginx для отдачи статического контента.
Установка nginx

  (tp-env) $ sudo apt-get install nginx

Конфигурация статических файлов

(tp-env) $ sudo vim /etc/nginx/sites-enabled/default
...
server {
    listen 80 default_server;

    location /static/ {
        root /home/user4/Projects/ask_sdemidenko/static/;
    }
}
...

Не работает?

  (tp-env) $ tail -f /var/log/nginx/error.log 
  2017/03/13 22:39:57 [error] 10077#10077: *1 open() "/home/user4/Projects/ask_sdemidenko/static/static/li.jpg" failed (2: No such file or directory), client: 127.0.0.1, server: _, request: "GET /static/li.jpg HTTP/1.1", host: "127.0.0.1"

Правим на хороший путь

  $ sudo vim /etc/nginx/sites-enabled/default
  ...
       location /static/ {
            root /home/user4/Projects/ask_sdemidenko/;
       }
  ...

  $ sudo service nginx restart

6. Настройка проксирования в nginx

  $ sudo vim /etc/nginx/sites-enabled/default
    
        location / {
                proxy_pass http://127.0.0.1:8080;
        }

  $ sudo service nginx restart

7. ab

$ sudo apt-get install apache2-utils
$ ab -c 10 -n 1000 "http://127.0.0.1/" > ~/tmp/ab.1.log

Выполнение этого gist`а не покрывает всё смешанное занятие 2. Это маленькие советы и напутствие, как лучше его делать. Читайте полное ДЗ для успокоение души.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment