From 980fe00a74a9ad013b945755415ace2e5429c3c2 Mon Sep 17 00:00:00 2001
From: Alexey Pyltsyn Каждая строка запроса содержит информацию о запросе. Первая часть называется заголовок и содержит важную информацию о запросе, точно так же, как HTML head содержит важную информацию о HTML-документе (но не содержимое документа, которое расположено внутри тэга "body"): В конце сообщения мы видим содержимое body, содержащее HTML-код возвращаемого ответа. В приведённом ниже тексте показан HTTP-запрос, сделанный когда пользователь загружает новые данные профиля на этом сайте. Формат запроса почти такой же, как пример запроса Ответ от запроса показан ниже. Код состояния « Для примера рассмотрим следующий код Django (Python), который связывает два URL-шаблона с двумя функциями просмотра. Первый шаблон проверяет, что HTTP-запрос с URL-адресом ресурса В приведённом ниже примере представлен список всех команд, у которых есть точный (с учётом регистра) Пример ниже показывает, как это работает в веб-фреймворке Django (Python). Каждая функция «view» (обработчик запроса) получает объект Различные фреймворки используют различные механизмы для сопоставления. Например, веб-фреймворк Flask (Python) добавляет маршруты для просмотра функций используя декораторы. Django ожидает, что разработчики определят список сопоставлений URL-адресов между шаблоном URL-адреса и функцией просмотра.GET https://developer.mozilla.org/en-US/search?q=client+server+overview&topic=apps&topic=html&topic=css&topic=js&topic=api&topic=webdev HTTP/1.1
+
GET https://developer.mozilla.org/en-US/search?q=client+server+overview&topic=apps&topic=html&topic=css&topic=js&topic=api&topic=webdev HTTP/1.1
Host: developer.mozilla.org
Connection: keep-alive
Pragma: no-cache
@@ -132,7 +132,7 @@ Cookie: sessionid=6ynxs23n521lu21b1t136rhbv7ezngie; csrftoken=zIPUJsAZv6pcgCBJSC
HTTP/1.1 200 OK
+
HTTP/1.1 200 OK
Server: Apache
X-Backend-Server: developer1.webapp.scl3.mozilla.com
Vary: Accept,Cookie, Accept-Encoding
@@ -166,7 +166,7 @@ Content-Length: 41823
GET
, показанный ранее, хотя первая строка идентифицирует этот запрос как POST
.POST https://developer.mozilla.org/en-US/profiles/hamishwillee/edit HTTP/1.1
+
POST https://developer.mozilla.org/en-US/profiles/hamishwillee/edit HTTP/1.1
Host: developer.mozilla.org
Connection: keep-alive
Content-Length: 432
@@ -190,7 +190,7 @@ csrfmiddlewaretoken=zIPUJsAZv6pcgCBJSCj1zU6pQZbfMUAT&user-username=hamishwil
302 Found
» сообщает браузеру, что сообщение обработано, и что необходим второй HTTP-запрос для загрузки страницы, указанной в поле Location
. В остальном информация аналогична информации для ответа на запрос GET
.HTTP/1.1 302 FOUND
+
HTTP/1.1 302 FOUND
Server: Apache
X-Backend-Server: developer3.webapp.scl3.mozilla.com
Vary: Cookie
@@ -277,7 +277,7 @@ Content-Length: 0
/best
будет передан функции с именем index()
в модуле views
. Запрос, который имеет шаблон «/best/junior
», вместо этого будет передан функции просмотра junior()
.# file: best/urls.py
+
# file: best/urls.py
#
from django.conf.urls import url
@@ -299,7 +299,7 @@ urlpatterns = [
team_type
«junior» («младший») — обратите внимание на формат: имя поля (team_type
), за которым следует двойной знак подчёркивания, а затем тип соответствия для использования (в этом случае exact
(«точное»)). Существует много других типов соответствия, и мы можем объединить их. Мы также можем контролировать порядок и количество возвращаемых результатов.#best/views.py
+
#best/views.py
from django.shortcuts import render
diff --git a/files/ru/learn/server-side/first_steps/web_frameworks/index.html b/files/ru/learn/server-side/first_steps/web_frameworks/index.html
index 54d00a7baf..ec0f7368c9 100644
--- a/files/ru/learn/server-side/first_steps/web_frameworks/index.html
+++ b/files/ru/learn/server-side/first_steps/web_frameworks/index.html
@@ -47,7 +47,7 @@ translation_of: Learn/Server-side/First_steps/Web_frameworks
HttpRequest
, содержащий информацию о запросе, и должна вернуть объект HttpResponse
с форматированным выводом (в этом случае строка).# Django view function
+
# Django view function
from django.http import HttpResponse
def index(request):
@@ -63,13 +63,13 @@ def index(request):
@app.route("/")
+
@app.route("/")
def hello():
return "Hello World!"
urlpatterns = [
+
urlpatterns = [
url(r'^$', views.index),
# example: /best/myteamname/5/
url(r'^best/(?P<team_name>\w.+?)/(?P<team_number>[0-9]+)/$', views.best),
@@ -97,7 +97,7 @@ def hello():
Первый фрагмент кода ниже показывает очень простую модель Django для объекта Team
. Это сохраняет название команды и уровень команды как символьные поля и определяет максимальное количество символов для каждой записи. team_level
— это поле выбора, поэтому здесь мы связываем варианты значений на выбор с сохраняемыми данными, а также значение по умолчанию.
#best/models.py +#best/models.py from django.db import models @@ -117,7 +117,7 @@ class Team(models.Model):
Второй фрагмент кода показывает функцию представления (обработчик ресурсов) для отображения всех наших команд U09. В этом случае мы указываем, что мы хотим фильтровать для всех записей, где полеteam_level
имеет в точности текст «U09» (обратите внимание ниже, как этот критерий передаётся функцииfilter()
в качестве аргумента с именем поля и типом соответствия, отделённым двойным подчёркиванием: team_level__exact). -#best/views.py +#best/views.py from django.shortcuts import render from .models import Team @@ -145,7 +145,7 @@ def youngest(request):Фрагмент кода ниже показывает, как это работает. Продолжая пример «самой молодой команды» из предыдущего раздела, HTML-шаблон передаёт представлению переменную списка
-youngest_teams
. Внутри скелета HTML у нас есть выражение, которое сначала проверяет, существует ли переменнаяyoungest_teams
, а затем повторяет её в циклеfor
. На каждой итерации шаблон отображает значениеteam_name
команды в элементе списка.#best/templates/best/index.html +#best/templates/best/index.html <!DOCTYPE html> <html lang="en"> diff --git a/files/ru/learn/server-side/first_steps/website_security/index.html b/files/ru/learn/server-side/first_steps/website_security/index.html index 1f976dd741..912fa2c0d5 100644 --- a/files/ru/learn/server-side/first_steps/website_security/index.html +++ b/files/ru/learn/server-side/first_steps/website_security/index.html @@ -73,11 +73,11 @@ original_slug: Learn/Server-side/First_steps/Веб_Безопасность
Эта уязвимость присутствует, если пользовательский ввод, который передаётся в базовый оператор SQL, может изменить смысл оператора. Например, следующий код предназначен для перечисления всех пользователей с определённым именем (userName), которое было предоставлено из формы HTML: -statement = "SELECT * FROM users WHERE name = '" + userName + "';"+statement = "SELECT * FROM users WHERE name = '" + userName + "';"Если пользователь указывает реальное имя, оператор будет работать так, как задумано. Однако злонамеренный пользователь может полностью изменить поведение этого оператора SQL на новый оператор в следующем примере, просто указав текст полужирным шрифтом для userName.
-SELECT * FROM users WHERE name = 'a';DROP TABLE users; SELECT * FROM userinfo WHERE 't' = 't'; +SELECT * FROM users WHERE name = 'a';DROP TABLE users; SELECT * FROM userinfo WHERE 't' = 't';Модифицированный оператор создаёт действительный оператор SQL, который удаляет таблицу пользователей и выбирает все данные из таблицы userinfo (которая раскрывает информацию о каждом пользователе). Это работает, потому что первая часть введённого текста (a ';) завершает исходное утверждение.
@@ -90,7 +90,7 @@ original_slug: Learn/Server-side/First_steps/Веб_БезопасностьВ следующей инструкции мы экранируем символ '. Теперь SQL будет интерпретировать имя как всю строку, выделенную жирным шрифтом (это действительно очень странное имя, но безопасное).
-SELECT * FROM users WHERE name = 'a\';DROP TABLE users; SELECT * FROM userinfo WHERE \'t\' = \'t'; +SELECT * FROM users WHERE name = 'a\';DROP TABLE users; SELECT * FROM userinfo WHERE \'t\' = \'t';-- cgit v1.2.3-54-g00ecf