Let's have a REST, часть III

В части I рассказано о том, что такое REST и что значит для приложения быть RESTful. На несложном примере проиллюстрирован процесс проектирования RESTful приложения. В части II рассмотрены некоторые детали протокола HTTP в связи с реализацией на его основе RESTful приложений. В частности, рассказано, в чем разница между HTTP-методами POST и PUT, что такое идемпотентность, как обойти ограничения языка HTML и сделать браузерное HTML-приложение RESTful (ну, почти RESTful).

В данной, заключительной части, будут рассмотрены два RESTful приложения, написанные на Python с использованием микрофреймворка Flask. Оба приложения позволяют вести список книг, то есть, просматривать, добавлять, изменять и удалять книги из списка. Эти два приложения:

  • RESTful web-сервис и его клиент,
  • RESTful HTML-приложение, с которым пользователь работает в браузере.

Я не буду рассказывать о том, как установить Flask (соответствующая инструкция есть на сайте), а также об основах работы с Flask (об этом отлично рассказано в разделе Quickstart руководства пользователя).

Перейду сразу к делу и представлю код web-сервиса, возвращающего CSV-представление списка книг:

# -*- coding: utf-8 -*-

from flask import Flask, url_for

app = Flask(__name__)

books = {1 : [u'Лев Толстой', u'Война и мир']}
HEADERS = {'Content-Type' : 'text/csv; charset=utf-8'}

def csvbook(id):
return u"%s;%s;%sn" % (id, books[id][0], books[id][1])

@app.route('/')
@app.route('/books')
def index():
text = ''
for key in books.keys():
text += csvbook(key)
return text, 200, HEADERS


if __name__ == '__main__':
app.run(debug=True)

Поскольку приложение призвано продемонстрировать принципы REST, то все, что сопутствует этой демонстрации, написано как можно проще, чтобы занимать меньше места и быть понятным без объяснений. Так, книги будем хранить не в базе данных, а в словаре books, где ключ — целое число, а значение — список из двух строковых значений: автор книги, название книги.

Функция index() обрабатывает запросы GET для URL /books и /. Формируется CSV-представление списка книг из словаря books, используя функцию csvbook(id) для получения CSV-строки с данными каждой книги. Сформированное представление возвращается клиенту, причем ответ имеет статус 200 (OK) и HTTP-заголовок, задающий тип и кодировку возвращаемых данных.

Запустив наш сервис

C:> python restful-ws-01.py
* Running on http://127.0.0.1:5000/
* Restarting with reloader

и введя в брузере адрес http://localhost:5000/books, получим файл, содержащий

1;Лев Толстой;Война и мир

Не очень удобно тестировать RESTful web-сервис с помощью браузера. В интернет-магазине Chrome есть приложение Advanced Rest Client, которое существенно упрощает ручное тестирование RESTful web-сервиса. Рекомендую попробовать.

Но в этой статье пойду другим путем и напишу клиента для нашего web-сервиса на Python:

# -*- coding: utf-8 -*-

import requests

def print_response(resp):
print " url: %s" % resp.url
print " status: %s %s" % (resp.status_code, resp.reason)
print "headers: %s " % resp.headers
print " data:n%s" % resp.text

print_response(requests.get("http://localhost:5000/books"))

Я использую библиотеку Requests, которая делает отправку HTTP-запросов с различными методами тривиальной задачей. Результат выполнения приведенного кода:

    url: http://localhost:5000/books
status: 200 OK
headers: CaseInsensitiveDict({'date': 'Thu, 13 Mar 2014 04:39:50 GMT', 'content-length': '45', 'content-type': 'text/csv; charset=utf-8', 'server': 'Werkzeug/0.9.4 Python/2.7.3'})
data:
1;Лев Толстой;Война и мир

Прежде чем реализовать следующие методы web-сервиса и написать для них клиентские запросы, приведу полный список ресурсов и методов web-сервиса:

/books        GET       получить список книг
/books POST создать новую книгу
/books/ GET получить данные книги
/books/ PUT изменить данные книги
/books/ DELETE удалить книгу

Вот код, реализующий перечисленные методы web-сервиса, а также обработчик для случая, когда запрошенный ресурс отсутствует:

# -*- coding: utf-8 -*-

from flask import Flask, request, abort, url_for

app = Flask(__name__)

books = {1 : [u'Лев Толстой', u'Война и мир']}
HEADERS = {'Content-Type' : 'text/csv; charset=utf-8'}

def csvbook(id):
return u"%s;%s;%s;%sn" %
(id, books[id][0], books[id][1], url_for('show', id=id, _external = True))

@app.route('/')
@app.route(&# 39;/books')
def index():
text = ''
for key in books.keys():
text += csvbook(key)
return text, 200, HEADERS

@app.route('/books', methods=['POST'])
def create():
new_id = len(books) + 1
books[new_id] = [request.form['author'], request.form['title']]
return csvbook(new_id), 201, HEADERS

@app.route('/books/')
def show(id):
if books.get(id):
return csvbook(id), 200, HEADERS
else:
abort(404)

@app.route('/books/', methods=['PUT'])
def update(id):
if books.get(id):
books[id] = [request.form['author'], request.form['title']]
else:
abort(404)
return csvbook(id), 200, HEADERS

@app.route('/books/', methods=['DELETE'])
def delete(id):
if books.get(id):
del books[id]
return u'OK', 200, HEADERS

@app.errorhandler(404)
def not_found(error):
return u'404: not found', 404, HEADERS


if __name__ == '__main__':
app.run(debug=True)

Ниже код клиента, тестирующий все методы нашего web-сервиса:

# -*- coding: utf-8 -*-

import requests

def print_response(resp):
print " url: %s" % resp.url
print " status: %s %s" % (resp.status_code, resp.reason)
print "headers: %s " % resp.headers
print " data:n%s" % resp.text

def list_books():
print("n### GET http://localhost:5000/booksn")
print_response(requests.get("http://localhost:5000/books"))


list_books

print("n### POST http://localhost:5000/booksn")
payload = {'author' : u'Александр Пушкин', 'title' : u'Пиковая дама'}
resp = requests.post("http://localhost:5000/books", data=payload)
print_response(resp)

list_books

print("n### PUT http://localhost:5000/books/2n")
payload = {'author' : u'Лев Толстой', 'title' : u'Анна Каренина'}
resp = requests.put("http://localhost:5000/books/2", data=payload)
print_response(resp)

list_books

print("n### DELETE http://localhost:5000/books/2n")
print_response(requests.delete("http://localhost:5000/books/2"))

list_books

print("n### GET http://localhost:5000/books/1n")
print_response(requests.get("http://localhost:5000/books/1"))

print("n### GET http://localhost:5000/books/2n")
print_response(requests.get("http://localhost:5000/books/2"))

Запустив web-сервис, выполните код клиента, чтобы убедиться в его работоспособности. Изучите выведенную клиентом информацию. Обратите внимание на ответы, которые возвращает каждый из методов web-сервиса клиенту.

Теперь перейдем к браузерному RESTful приложению. Оно поддерживает следующие ресурсы и операции:


/books GET получить представление списка книг
/books/new GET получить форму для ввода данных новой книги
/books POST создать новую книгу
/books/ GET получить представление книги
/books//edit GET получить форму для изменения данных книги
/books/ POST изменить данные книги
_method='PUT'
/books//delete POST удалить книгу
_method='DELETE'

Здесь адреса ресурсов следуют соглашениям фреймворка Ruby on Rails — законодателя мод в области RESTful web-приложений. Так как язык HTML не поддерживает запросы к серверу с методами PUT и DELETE, то эти методы имитируются при помощи скрытых полей форм с именем _method.

Ниже приведен код браузерного приложения:

# -*- coding: utf-8 -*-

from flask import Flask, request, redirect, abort

# GET and HEAD are safe
# GET, HEAD, PUT and DELETE are idempotent
# (RFC 2616 http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9)


app = Flask(__name__)
books = {1 : [u'Лев Толстой', u'Война и мир']}

list_books_template = u"""



Список книг



Список книг




%s
idАвторНазвание







"""

show_book_template = u"""



Книга



Книга






id%s
Автор%s
Название%s


К списку книг


"""

edit_book_template = u"""



Книга - Изменить



Книга - Изменить








id%s
Автор
Название








К списку книг


"""

new_book_template = u"""



Книга - Добавить



Книга - Добавить






Автор
Название




К списку книг


"""

error404_template = u"""



Список книг


Такой страницы нет :(




"""

@app.route('/')
@app.route('/books')
def index():
text = ''
for key, val in books.items():
text += u'Edit%s%s%s' % (key, key, key, val[0], val[1])
return list_books_template % text

@app.route('/books/new')
def new():
return new_book_template

@app.route('/books', methods=['POST'])
def create():
new_id = len(books) + 1
books[new_id] = [request.form['author'], request.form['title']]
return show_book_template % (new_id, books[new_id][0], books[new_id][1])


@app.route('/books//edit')
def edit(id):
if books.get(id):
return edit_book_template % (id, id, books[id][0], books[id][1], id)
else:
abort(404)

@app.route('/books/', methods=['GET', 'POST']) # PUT and DELETE
def show(id):
if request.method == 'GET':

# /books/ GET

if books.get(id):
return show_book_template % (id, books[id][0], books[id][1])
else:
abort(404)
elif request.method == 'POST' and request.form['_method'] == 'PUT':

# /books/ PUT

if books.get(id):
books[id] = [request.form['author'], request.form['title']]
else:
abort(404)
return show_book_template % (id, books[id][0], books[id][1])
elif request.method == 'POST' and request.form['_method'] == 'DELETE':

# /books/ DELETE

if books.get(id):
del books[id]
return redirect('/books')


@app.errorhandler(404)
def not_found(error):
return error404_template, 404


if __name__ == '__main__':
app.run(debug=True)

Запустив приложение

C:> python restful-server.py
* Running on http://127.0.0.1:5000/
* Restarting with reloader

и введя в браузере адрес http://localhost:5000/books, попробуйте просматривать, изменять, добавлять и удалять книги.

В отличие от web-сервиса, в браузерном RESTful приложении большую роль играют гиперссылки, содержащиеся в представлениях (HTML-страницах), возвращаемых сервером клиенту (браузеру). Гиперссылки раскрывают перед пользователем структуру приложения, предлагая ему на выбор возможные варианты действий.

Пока всё. Let's have a rest!

Автор: Andrei Trofimov
Дата публикации: 2014-03-19T21:05:00.000+11:00

Видеолекции курса Распределенные системы хранения и обработки данных

Видеолекции курса Распределенные системы хранения и обработки данных.

Лектор: Владислав Белогрудов.

В курсе дано всестороннее представление о системах и сетях хранения данных, их применимости для построения облачной инфраструктуры. Подробно рассматриваются вопросы дизайна и виртуализации сетей хранения данных, информационной безопасности и доступности.


Лекция 1. Введение в системы хранения данных (СХД).

  • данные и информация
  • типы данных
  • большие данные
  • эволюция СХД
  • архитектура центра обработки данных (ЦОД)
  • характеристики ЦОД
  • жизненный цикл информации
  • иерархическое управление носителями


Посмотреть видео на сайте Лекториума

Дополнительные материалы


Скачать: Презентация

Лекция 2. Среда систем хранения данных.

  • Oсновные элементы
  • Виртуализация приложений и серверов
  • Компоненты жесткого диска и его производительность
  • Накопители SSD


Посмотреть видео на сайте Лекториума

Дополнительные материалы


Скачать: Презентация

Лекция 3. Защита данных с помощью RAID.

  • Методы и техники
  • Типы
  • Производительность
  • Cравнение и области применения


Посмотреть видео на сайте Лекториума

Дополнительные материалы


Скачать: Презентация

Лекция 4. Архитектура СХД.

  • основные компоненты
  • управление кешированием, защита от сбоев
  • классы СХД


Посмотреть видео на сайте Лекториума

Дополнительные материалы


Скачать: Презентация

Лекция 5. Сети хранения FC SAN.

  1. DAS
  2. SCSI
  3. SAN
    • компоненты
    • архитектура
    • топологии
    • зонирование


Посмотреть видео на сайте Лекториума

Дополнительные материалы


Скачать: Презентация

Лекция 6. IP SAN, FCoE, NAS, CAS.

  • протоколы
  • компоненты
  • топологии


Посмотреть видео на сайте Лекториума

Дополнительные материалы


Скачать: Презентация

Лекция 7. OpenStack.

  • Собственное облако
    • Зачем
    • Отличия от решений виртуализации серверов
  • История развития
  • Проекты
    • Swift
    • Glance
    • Nova
    • Cinder
    • Quantum

  • Посмотреть видео на сайте Лекториума

    Дополнительные материалы


    Скачать: Презентация

    Лекция 8. Непрерывность бизнеса, резервное копирование и восстановление.

    • необходимость
    • метрики непрерывности
    • методы борьбы с SPOF
    • топологии резервного копирования
    • дедупликация
    • резервное копирование в виртуальной среде


    Посмотреть видео на сайте Лекториума

    Дополнительные материалы


    Скачать: Презентация

    Лекция 9. Локальная и удаленная репликация.

    • синхронный и асинхронный режим
    • методы
    • топологии


    Посмотреть видео на сайте Лекториума

    Дополнительные материалы


    Скачать: Презентация

    Лекция 10. Безопасность инфраструктуры хранения в облачных датацентров.

    • угрозы
    • уязвимости
    • методы борьбы


    Посмотреть видео на сайте Лекториума

    Дополнительные материалы

    Скачать: Презентация

    Лекция 11. Программно определяемые сети (SDN).

    • Предпосылки
    • История
    • Принципы
    • Технологии
    • Области применения

    Дополнительные материалы

    Скачать: Презентация

    Лекция 12. Управление инфраструктурой хранения и обработки данных.

    • Ключевые понятия
    • Стандарты управления
    • Технологии
    • Архитектуры

    Дополнительные материалы

    Скачать: Презентация

    Автор: Roman Brovko

Видеолекции курса Современные технологии разработки ПО

Видеолекции курса Современные технологии разработки ПО.

Лектор: Александр Смаль.

Курс предназначен для краткого знакомства с некоторыми широко распространёнными с технологиями, которые используются при разработке программного обеспечения. В курсе будет рассказано о Linux, скриптовых языках, VCS, XML и многом другом.

Лекция 1. История UNIX систем.

  • Создание UNIX.
  • Ответвление BSD.
  • Коммерческие версии UNIX.
  • Возникновение GNU.
  • Становление Linux систем.
  • Развитие BSD систем.
  • Краткая характеристика современных дистрибутивов Linux.


Посмотреть видео на сайте Лекториума

Дополнительные материалы


Скачать: Презентация

Лекция 2. Файлы и пользователи в Linux.

  • Зачем нужен shell?
  • Основы работы в bash-e.
  • Файлы и файловая система.
  • Пользователи и группу.
  • Права доступа.


Посмотреть видео на сайте Лекториума

Дополнительные материалы


Скачать: Презентация

Лекция 3. Работа и программирование в shell-e.

  • Процессы
  • Маски файлов
  • «Одна задача — одна программа».
  • Работа с потоками ввода-вывода (stdout, stdin, stderr).
  • Перенаправление потоков.
  • Создание конвееров.
  • Редакторы. Как выйти из vi =).
  • Создание скриптов.
  • Основы программирования bash: переменные, циклы, условные выражения.


Посмотреть видео на сайте Лекториума

Дополнительные материалы


Скачать: Презентация

Лекция 4. Регулярные выражения.

  • Зачем нужны регулярные выражения?
  • Типы регулярных выражений.
  • Введение в синтаксис PCRE.
  • «Жадные» и не «жадные» регулярные выражения.
  • Способы применения регулярных выражений: поиск и замена.


Посмотреть видео на сайте Лекториума

Дополнительные материалы


Скачать: Презентация

Лекция 5. Язык Perl.

  • История.
  • Что значит «интерпретируемый язык».
  • Основные типы данных.
  • Основы синтаксиса.
  • Основные операции с числами и строками («.», сравнение строк)
  • Основные конструкции (циклы, услоные выражения, switch).
  • Регулярные выражения.
  • Массивы и хэши.
  • Функции.


Посмотреть видео на сайте Лекториума

Дополнительные материалы

Лекция 6. Язык Ruby.

  • История.
  • Области применения.
  • Основы синтаксиса.
  • Основные типы данных.
  • Структуры данных.
  • ООП.


Посмотреть видео на сайте Лекториума

Дополнительные материалы

Лекция 7. XML.

  • Зачем нужны языки разметки?
  • Почему именно XML?
  • Какие проблемы решаются использованием XML, а какие нет.
  • Что такое DOM и SAX?
  • XML библиотеки для разных языков программирования.
  • Описания XML схем.
  • XSLT.
  • XPath.


Посмотреть видео на сайте Лекториума

Дополнительные материалы


Скачать: Презентация

Лекция 8. Системы контроля версий.

  • История систем контроля версий.
  • Основные понятия.
  • CVS, SVN.
  • Распределённые системы контроля версий.
  • Основные сценарии работы.


Посмотреть видео на сайте Лекториума

Дополнительные материалы


Скачать: Презентация

Лекция 9. LaTeX.

  • WYSISWG.
  • История не WYSISWG издательских систем: ROFF, TeX, LaTeX.
  • Как TeX обрабатывает документы.
  • Математические формулы в TeX.
  • Как LaTeX расширяет TeX.
  • Основные средства разметки LaTeX.
  • Создание презентаций в LaTeX.


Посмотреть видео на сайте Лекториума

Дополнительные материалы


Скачать: Презентация

Лекция 10. Кодировки текста.

  • История появления кодировок.
  • Кодировки для кириллического текста.
  • Много байтовые кодировки.
  • Unicode.
  • Передача данных через почтовый протокол: base64.


Посмотреть видео на сайте Лекториума

Дополнительные материалы


Скачать: Презентация

Лекция 11. Технологии Web-разработки.

  • Протокол HTTP.
  • CGI.
  • DHTML.
  • CMF и CMS.


Посмотреть видео на сайте Лекториума

Дополнительные материалы


Скачать: Презентация

Автор: Roman Brovko

Худеем в любом возрасте. 50+

Худеем в любом возрасте. 50+Как ни парадоксально, но многие женщины после 50
задумываются о похудении чаще, чем в 30 или 40. Просто именно в этом возрасте
они начинают в полной мере понимать, какое негативное действие оказывают
избыточный вес и неправильное питание на их здоровье и самочувствие.

 Почему ты толстеешь?

Худеем в любом возрасте. 50+Замедленный обмен веществ уже не в состоянии справиться с
лишней съеденной конфеткой так же легко, как это было в 20 или 30 лет.

Обострение хронических заболеваний и приобретение новых
снижают физической активность, порой заставляя напрочь забыть о ней.

За всю свою жизнь женщина настолько привыкла заниматься кем
угодно (детьми, мужем, родителями), только не собой, что после 50 «похудательные
мероприятия» кажутся ей просто диковинными.

Расшатанная за 50 лет жизни психика уже не может справляться
с сильными эмоциями. Поэтому во время стрессов организм быстро откладывает про запас
жир из простых углеводов.

Секреты стройности 

Худеем в любом возрасте. 50+Объяви бойкот сидячему образу жизни! Прочь от телевизора с «мыльными»
сериалами и айда на прогулку в парк! Старайся проходить за день не менее 5-6
км.

Решив заняться фигурой, не строй иллюзий. Не жди, что
похудеешь за месяц больше, чем на 2 кг. Поэтому, увидев через неделю на весах
прежний вес, не беги от отчаяния и обиды к холодильнику за очередной котлеткой.

Не налегай на белок. Его избыток отправится в «жировые
ловушки». Употребляй мясо 2-3 раза в неделю по 70 гр.

Включи в рацион больше клетчатки. Но с нею тоже не
переборщи. Норму легко почувствовать по состоянию кишечника.

Чаще находись на солнце (только не под прямыми лучами!). Солнце
– двигатель обменных процессов и источник энергии.

Наилучший вид спорта в этом возрасте – плавание. Оно не
только порадует тонизирующим эффектом, но и пощадит суставы.

  ТОП-5 продуктов для тебя

Худеем в любом возрасте. 50+1. Авакадо, благодаря высокому содержанию витамина Е и
мононасыщенных жиров, поможет сохранить гладкость кожи, блеск волос, снизить
уровень вредного холестерина в крови.

2. Ягоды (особенно черного и синего цвета!) обладают
антиоксидантным, антиварикозным, кардиопротекторным, противоаллергическим и
иммуномоделирующим действием. Отдавай предпочтение чернике, смородине, темному
винограду.

3. Растения семейства крестоцветных (цветная, брюссельская,
краснокачанная капуста, брокколи, репа, редис) помогут в борьбе с токсинами,
замедлят процесс старения организма.

4. Рыба понизит уровень вредного холестерина и станет
источником молодости и красоты.

5. Шпинат – источник железа, кальция, витаминов А, С и К –
защитит от инфаркта, инсульта, остеопороза и артрита.

Выше нос! Все только начинается!

 Узнай, как похудеть в 20+30+40+ лет!

Худеем в любом возрасте. 40+

Худеем в любом возрасте. 40+Многие женщины после 40 лет отказываются работать над своей
фигурой, думая, что высоких результатов им добиться все равно не удастся. Ведь
и кожа уже не та, и силы не те… Зрелые дамы облачаются в мешковатую одежду и,
грубо говоря, ставят на себе крест. Таким образом, они просто маскируют нежелание
ограничивать себя в еде и быть физически активными. Им не хочется прилагать
какие-либо усилия, но в собственной лени признаться стыдно. Поэтому приходится
все списывать на возраст. Прочь лень! Взбодрись! Сорок – это вторая молодость!

Почему ты толстеешь?

Худеем в любом возрасте. 40+Мышечная масса женщины после 40 лет на половину или на треть
теряется, замещаясь жировой тканью. Такова физиология. Чем меньше мышц, тем
медленнее сжигаются калории.

Процесс метаболизма с каждым годом все больше замедляется.

Твои движения неторопливы. Ведь ты – солидная дама, делаешь
все взвешенно, четко, размеренно. И по лестнице ты не побежишь… И маленький
ребенок, которого раньше приходилось догонять и носить на руках, давно уже
вырос… И за автобусом гнаться не станешь, смиренно дожидаясь следующего. Вот и
получается, что экономия энергии откладывается на талии.

Психологически ты уже не настроена на созидание. Половина
жизни потрачена на достижение того, что ты сейчас имеешь. Тебе кажется, что теперь
нужно просто пользоваться нажитым, не пытаясь его усовершенствовать. Потому и
пользуешься своей полноватой фигурой, считая, что и так достаточно поработала
над ней в прошлом.

Секреты стройности

Худеем в любом возрасте. 40+Для начала приведи в порядок психологическое состояние.
Настройся на волну оптимизма, найди новые увлечения, гори интересом к чему-то и
ставь перед собой новые цели. Впереди еще половина жизни!

Снизь калорийность рациона на 10%.

Перейди на дробное питание.

Вноси изменения в жизнь с удовольствием. Не страдай из-за отказа
от пирожного на ночь, а утешь себя тем, что это способствует полноценному сну и
бодрости на весь следующий день.

Не забывай о физических нагрузках и тонизирующих процедурах
(контрастный душ, массаж)

ТОП-5 продуктов для тебя

Худеем в любом возрасте. 40+1.Помидоры черри, благодаря высокому содержанию пигмента
ликопина, помогут защитить организм от окислительных процессов.

2. Льняное масло снизит уровень «плохого» холестерина.

3. Клюквенный сок, богатый витамином С и прочими
антиоксидантами, поможет сохранить молодость организма
.

4. Йогурт из овечьего молока улучшит тургор мышечной ткани и
замедлит процессы старения.

5. Грецкие орехи защитят организм от опухолевых процессов.
Съедай 50 гр. ежедневно.

Радуйся жизни! Живи легко! Забудь про возраст!

 
Узнай, как похудеть в 20+, 30+50+ лет!

Худеем в любом возрасте. 30+

Худеем в любом возрасте. 30+Переступив тридцатилетний рубеж, женщина уже, как правило,
реализована как жена, мать и специалист в определенной области. На ее плечи
ложатся бытовые хлопоты, воспитание ребенка. Времени на себя не остается. Да и
стимула явного нет для того, чтобы быть всегда в идеальной форме. Ведь вот он –
муж, рядом, под боком. Не нужно уже никого сражать своей красотой, влюблять в
себя. В этом часто и заключается роковая ошибка женщин, брак которых
разрушается из-за лишних складок на животе. Не дай себе расслабиться!

Почему ты толстеешь?

Худеем в любом возрасте. 30+В твоем возрасте процесс обмена веществ значительно
замедляется.

Смена гормонального фона во время беременности и после
родов, естественно, вовсе не идет на пользу фигуре.

На твоем теле уже образовались «жировые ловушки» (на бедрах,
животе), в которые долгое время откладывались все лишние употребленные калории.
С этими «стратегическими запасами» очень сложно бороться.

К тридцати годам твоя физическая активность, вероятнее
всего, существенно снизилась. Многочасовые романтические прогулки, танцы до
упаду ночи напролет остались в прошлом. Да и на фитнес выкроить время не
удается: работа – дом, дом – работа.

Секреты стройности

Задача номер один – ускорить процесс метаболизма. Достичь
этого можно при помощи
специальных физических нагрузок.

Не истерии, когда видишь шокирующие цифры на весах. Не
впадай в крайности. Тебе уже должно хватать мудрости на то, чтоб объективно оценивать
ситуацию и принимать правильные меры. Паника и отчаяние лишь заставят тебя
плотно покушать в очередной раз.

ТОП-5 продуктов для тебя

Худеем в любом возрасте. 30+Кефир – ценный источник кальция. Выпивай не менее одного
стакана в день.

Брокколи богата витамином С, бета-кароттином.

Киви содержит антиоксиданты, витамин Е, которые отвечают за
зрение.

Рыба благодаря содержанию омега-3 жирных кислот позволит сохранить
кожу более упругой, выровняет ее цвет и уменьшит воспаление.

Зеленые листовые овощи защитят организм от стресса, укрепят
коллагеновые волокна.

Будь стройной и красивой!

Узнай, как похудеть в 20+40+, 50+ лет!