отчет2
.docxМинистерство образования Республики Беларусь
УО «Полоцкий государственный университет»
Факультет информационных технологий
Кафедра технологий программирования
ОТЧЕТ
О прохождении курса по дисциплине
«Программирование для Интернет»
на тему «Web-технологии»
Выполнил студент группы
Проверил
Полоцк
1. Как называется этот курс?
Web-технологии
2. Что из нижеперечисленного является корректным MIME типом?
text/html
application/javascript
text/javascript
text/css
image/jpeg
3. В вашем браузере загружена страница с URL https://site.com/library/new
На какой (абсолютный) URL перейдет браузер при клике по ссылке вида /../best/ ?
https://site.com/best/
4. В вашем браузере загружена страница с URL https://site.com/library/123.html?full=1
На какой URL перейдет браузер при клике по ссылке вида /library/234.html#chapter2?
https://site.com/library/234.html#chapter2
5. Выберите правильные способы загрузки связанных ресурсов
A) <style src="/index.css"></style>
B) <link rel="stylesheet" href="/index.css">
C) <script href="/js/jquery.js">
D) <script src="/js/jquery.js"></script>
E) <code src="/js/jquery.js"></code>
F) <img src="/img/logo.png">
G) <img href="/img/logo.png"></img>
B
D
F
6. Какой web-сервер (программа и версия) обслуживает URL https://stepic.org/favicon.ico
Название web-сервера можно узнать из заголовка Server HTTP ответа.
Nginx/1.10.3
7. На странице https://stepik.org/explore используются различные CSS файлы.
Введите путь первого CSS файла, который загружается с домена stepik.org с помощью HTML.
Внимание: нужно ввести именно часть URL соответствующую пути, а не весь URL. Динамически загружаемые (с помощью JavaScript) стили - не учитывать.
/static/frontend-build/critical.css
8. В вашем браузере загружен документ c URL = https://site.com/path/to/page
Вы щелкаете на гиперссылку с URL = ../another/page
На какой URL перейдет браузер в итоге?
https://site.com/path/another/page
9. В вашем браузере загружен документ c URL = https://site.com/path/to/page/
Вы щелкаете на гиперссылку с URL = another_page.html
На какой URL перейдет браузер в итоге?
https://site.com/path/to/page/another_page.html
10. Напишите DocType HTML версии 5.
<!DOCTYPE html>
11. Выберите правильные высказывания о тэгах.
Для проверки ваших предположений можно использовать валидатор HTML https://validator.w3.org/nu/#textarea
Rows: |
div |
span |
img |
h1 |
p |
Занимает всю ширину |
✓ |
|
|
✓ |
✓ |
Можно задавать размер с помощью стилей width и height |
✓ |
|
✓ |
✓ |
✓ |
Внутри можно (валидно) разместить другие блочные тэги |
✓ |
|
|
|
|
12. Выберите правильное сочетание атрибутов тэгов form и input для загрузки файлов
method="POST" enctype="multipart/form-data" type="file"
13. Что здесь написано:
%D0%A3%D1%87%D0%B5%D0%BD%D1%8C%D0%B5%20-%20%D1%81%D0%B2%D0%B5%D1%82
Ученье – свет
14. Какой HTML-код применяется для подключения внешнего CSS-файла?
<link rel="stylesheet" type="text/css" href="style.css">
15. Расположите селекторы сверху вниз в порядке возрастания специфичности (приоритета).
div a
.article a
.article a.btn
#article a
div a#btn
16. Какие стили подействуют на тэг a ?
<html>
<p class="article">
Hello <a href="/">Stepic</a>!
</p>
<style>
body { color: red; }
p { font-size: 120%; }
a { width: 50px; margin-left: 5px; margin-top: 10px; }
</style>
</html>
font-size:120%; margin-left: 5px;
17. Вы хотите разделить страницу на две части. Какие стили для этого правильно использовать?
<div class="all">
<div class="left">...</div>
<div class="right">...</div>
</div>
.left, .right { float: left; width: 50% } .all { float: left; width: 100% } .all:after { clear: both }
18. Разработать простейший TCP echo сервер.
Требования:
Запускается на IP адресе 0.0.0.0 и TCP порту 2222
Получает сообщения длинной не более 1024 байт и отправляет обратно клиенту
Закрывает соединение при получении сообщения с текстом close
nano serv.py
19. Измените ваш echo сервер так, чтобы он работать одновременно с 10 клиентами. Протокол передачи такой же как в прошлой задаче.
nano serv.py
import socket
import threading
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0', 2222))
s.listen(20)
def server(conn, adrr):
while True:
data = conn.recv(1024)
if not data or data == 'close' : break
conn.send(data)
conn.close()
while True:
conn, adrr = s.accept()
print('Connection', adrr)
t = threading.Thread(target=server, args=(conn, adrr))
t.start()
20. Какие из указанных HTTP методов могут согласно спецификации протокола изменять состояние сервера ?
POST
PUT
21. Какие из указанных ниже HTTP Заголовков могут быть использованы в запросе, какие в ответе, а какие - в обоих случаях ?
HTTP Запрос: If-Modified-Since, Cookie, Connection, Content-Type, User-Agent, Content-Length
HTTP Ответ: Set-Cookie, Connection, Content-Type, Location, Date, Content-Length
22. Сопоставьте коды HTTP ответов и их значения:
200 - Запрос обработан успешно, в теле ответа содержится документ
301 - Теперь этот документ располагается по другому URL
302 - Для успешного выполнения запроса нужно сделать еще один запрос по URL, указанному в заголовке Location
304 - Документ не изменился с указанной даты. Можно использовать документ из кэша пользователя.
400 - Ошибка синтаксиса HTTP запроса
401 - Для данного URL требуется авторизация
403 - Доступ запрещен
404 - Документ не найден
500 - Внутренняя ошибка сервера
502 - Проксируемый (application) сервер ответил некорректно либо недоступен
23. Web-клиент и web-сервер обмениваются следующими пакетами:
GET /index.html HTTP/1.1
Host: site.com
Connection: Keep-Alive
...
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 1393
...
Будет ли сетевое соединение закрыто или останется открытым?
Останется открытым, т.к. используется HTTP/1.1 и нет заголовка Connection: close
24. Расставьте директивы в порядке приоритета (в порядке проверок):
location = /uploads/favicon.ico
location ^~ /uploads/
location ~ \.(ico|jpeg|jpg|png|css|js)$
location /uploads/
location /
25. Допустим имеется следующая конфигурация nginx
server {
listen 80;
server_name static.demo.org;
location ~ \.\w\w\w$ {
root /home/box/web/public;
}
}
server {
listen 80 default_server;
server_name _;
root /var/www/;
location ~ \.html$ {
proxy_pass http://127.0.0.1:8080/;
}
}
Какой файл будет отдаваться при следующем запросе ?
GET http://static.demo.org/index.html HTTP/1.0
Никакой, т.к. нет подходящего location. Сервер вернет ошибку 404
26. Допустим, у nginx запущены следующие процессы:
$ ps -o pid,ruser,cmd -C nginx
PID RUSER CMD
1718 root nginx: master process /usr/sbin/nginx
1719 www-data nginx: worker process
1720 www-data nginx: worker process
Nginx пытается отдать файл /home/box/web/1.html
Причем права доступа выглядят следующим образом:
$ ls -lad /home/ /home/box/ /home/box/web/ /home/box/web/1.html
drwxr-xr-x 4 root root 4096 Apr 11 2014 /home/
drwx------ 96 box box 12288 Oct 4 01:57 /home/box/
drwxr-xr-x 96 box box 8192 Oct 4 01:57 /home/box/web/
-rwxr--r-- 96 box box 1024 Oct 4 02:00 /home/box/web/1.html
Какой HTTP код ответа вернет Nginx ?
404, т.к. у сервера не хватит прав что бы даже проверить наличие файла
27.
1) Установите Web-сервер nginx
2) В директории /home/box (домашняя директория) создайте следующую структуру директорий
/home/box/web
|---public
| |---img
| |---css
| |---js
|---uploads
|---etc
3) Настройте nginx так что бы:
Все URL, начинающиеся с /uploads/ (например /uploads/1.jpeg) отдавались из директории /home/box/web/uploads
Все URL с расширением (например /img/1.jpeg) отдавались из директории /home/box/web/public
Все URL без расширения (например /question/123) возвращали HTTP 404
4) Фрагмент конфига nginx который обслуживает ваш проект должен находиться в файле /home/box/web/etc/nginx.conf и должен быть включен в основной конфиг с помощью символической ссылки.
5) Запустите nginx, так что бы он принимал запросы на порту 80 и обслуживал бы любые домены.
6) Не забудьте закомитить и сохранить на github полученную структуру директорий и конфиги.
git clone https://github.com/mrbrndk/nginx.git
chmod a+x init.sh
./init.sh
28. Какие задачи решает frontend сервер в трехзвенной архитектуре?
Балансировка нагрузки application серверов
Обслуживание статических документов
HTTPS шифрование
29. Сопоставьте CGI заголовки с их (вероятными) значениями:
QUERY_STRING - sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8&client=ubuntu
REMOTE_ADDR - 213.193.10.20
HTTP_USER_AGENT - Googlebot/2.1 (+http://www.googlebot.com/bot.html)
REQUEST_URI - /book/ch3/text.html
HTTP_HOST - www.demo.org
30. Какие из WSGI приложений корректны?
A)
def app(env, start_response):
start_response('200 OK', [('Content-Type', 'text/plain')])
return ['Hello, world!']
B)
def application(env, start_response):
start_response('200 OK')
return ['Hello, world!']
C)
def application(env, start_response):
start_response('200 OK', [('Content-Type', 'text/plain')])
return 'Hello, world!'
D)
def application(env):
return ['Hello, world!']
A
C
31. Переменная INSTALLED_APPS в settings.py содержит список установленных Django приложений. Допустим мы используем паттерн local settings и хотим (временно) подключить еще одно приложение - debug_toolbar. Что в таком случае мы должны написать в local_settings.py?
INSTALLED_APPS = ('debug_toolbar',) + tuple(INSTALLED_APPS)
32. Допустим в нашем приложении имеется группа URL следующего вида /blog/blog_name/post/title , где blog_name и title меняются для каждого блога и поста соответственно. Какая запись в urls.py позволит на обработать данные URL, захватив blog_name и title в одноименные переменные.
url(r'blog/(?P<blog_name>[^/]+)/post/(?P<title>[^/]+)/?', post_details)
33. Допустим в urls.py есть следующий маршрут
url(r'article/(?P<id>\d+)/?', article)
Какой из нижеприведенных view правильно получает захваченную переменную?
A)
def article(request, id):
...
B)
def article(request, *args):
id = args[0]
...
C)
def article(request, **kwargs):
id = kwargs[0]
...
D)
def article(request):
id = request.ARGS['id']
...
A
B
C
34. Выберите правильные способы получения GET параметров в Django view
A)
def view(request):
value = request.get('name')
B)
def view(request):
value = request['name']
C)
def view(request):
value = request.GET('name')
D)
def view(request):
value = request.GET['name']
E)
def view(request):
value = request.GET.get('name')
D
E
35. Сопоставьте классы HTTP ответов в Django и коды ответов в протоколе HTTP:
HttpResponseRedirect - 302
HttpResponsePermanentRedirect -301
HttpResponseNotFound - 404
HttpResponseBadRequest - 400
HttpResponseForbidden - 403
HttpResponse - 200
HttpResponseServerError – 500
36. Допустим имеются следующие два шаблона Django^
base.html
A
{% block A %}B{% endblock %}
C
index.html
{% extends 'base.html' %}
D
{% block A %}{{ block.super }}E{% endblock %}
F
Напишите текст (без переносов строк и пробелов), который получится при шаблонизации index.html
ABEC
37. Допустим вам нужно выбрать 1 статью с определенной категорией (не важно какую именно). Отметьте правильный (безопасный, эффективный, не создающий неожиданных исключений) способ сделать это:
A)
cursor.execute("select * from articles where category = " + category_id + " limit 1")
article = cursor.fetchall()[0]
B)
cursor.execute("select * from articles where category = %s", (category_id,))
article = cursor.fetchall()[0]
C)
cursor.execute("select * from articles where category = %s limit 1", (category_id,))
article = cursor.fetchone()
D)
cursor.execute("select * from articles where category = %s limit 1", (category_id,))
article = cursor.fetchmany(size=1)[0]
C
38. Выберите правильные способы получить прямой доступ к базе данных default (база по-умолчанию) в Django
A)
from django.db import connection
connection.cursor().execute(...)
B)
from django.db import default
default.cursor().execute(...)
C)
from django.db import connections
connections['default'].cursor().execute(...)
D)
from django.db import connect
connect('default').cursor().execute(...)
A
C
39. Перед вами определение модели Django:
class Post(object): # 1
title = models.CharField(max_length=255) # 2
content = models.TextField() # 3
creation_date = models.DateTimeField(blank=True) # 4
def __unicode__(self): # 5
return self.title() # 6
def get_absolute_url(self): # 7
return '/question/%d/' % self.pk # 8
class Meta: # 9
db_table = 'qa__question' # 10
ordering = ['-creation_date'] # 11
Выберите строки, в которых есть ошибки.
1
6
10
40. Сколько таблиц будет создано в СУБД, если определены следующие Django модели?
class User(models.Model):
name = models.CharField(max_length=24)
friends = models.ManyToManyField('User')
groups = models.ManyToManyField('Group')
class Group(models.Model):
name = models.CharField(max_length=100)
moderator = models.ForeignKey('User')
4
41. Какие из методов QuerySet возвращают также объект QuerySet (т.е. являются chaining методами):
exclude
count
order_by
42. Допустим имеются следующие модели.
class Author(models.Model):
rating = models.IntegerField()
name = models.CharField(max_length=50)
class Article(models.Model):
author = models.ForeignKey(Author)
text = models.TextField()
Необходимо выбрать статьи авторов с рейтингом более 10
best = Article.objects.filter(...)
Какое условие нужно написать на месте многоточия?
Author__rating__gt=10
43. Допустим имеются следующие модели.
class Author(models.Model):
rating = models.IntegerField()
name = models.CharField(max_length=50)
class Article(models.Model):
author = models.ForeignKey(Author)
text = models.TextField()
Выберите правильные способы создания нового объекта статьи (Article) для данного автора (объект author)
A) article = Article(author=author, text=text); article.save()
B) article = author.article_set.create(text=text)
C) article = Article.objects.create(text=text, author=author)
D) article = Article.objects.create(text=text, author_id=author.id)
A
B
C
D
44. Объект какого типа вернет следующий код
res = Author.objects.filter(id=10)
django.db.models.query.QuerySet
45. В чем разница между исключениям django.http.Http404 и django.core.exceptions.ObjectDoesNotExist?
Генерация Http404 приводит к тому, что сервер вернет код ответа 404, ObjectDoesNotExist – нет
46. Допустим имеются следующие модели.
class Author(models.Model):
rating = models.IntegerField()
name = models.CharField(max_length=50)
class Article(models.Model):
author = models.ForeignKey(Author)
text = models.TextField()
В шаблоне происходит отрисовка объекта article (тип Article)
Каким образом возможно вывести имя автора статьи?
A) {{ article.author.name }}
B) {% article.author.name %}
C) {{ article.author }}
D) {% article.author %}
E) Добавить дополнительную переменную в контекст шаблона перед отрисовкой
author_name = article.author.name
return render(request, 'article_details.html', {
'article': article,
'author_name': author_name,
})
И вызвать в шаблоне
{{ author_name }}
A
E
47. В каком примере приведен правильный способ использования пагинатора?
A)
from django.core.paginator import Paginator
def view(request):
articles = Article.objects.all()
articles = Paginator(articles, 10, request.GET.get('page', 1))
B)
from django.core.paginator import Paginator
def view(request):
articles = Article.objects.all()
paginator = Paginator(articles, request.GET['limit'])
page = paginator.page(request.GET['page'])
C)
from django.core.paginator import Paginator
def view(request):
articles = Article.objects.all()
paginator = Paginator(Article.objects.all(), 30, page=2)
articles = paginator.paginate()
D)
from django.core.paginator import Paginator
def view(request):
try:
limit = int(request.GET.get('limit', 10))
except:
limit = 10
try:
page = int(request.GET.get('page', 1))
except:
page = 1
paginator = Paginator(Article.objects.all(), limit)
articles = paginator.page(page)
D
48. Выберите правильный способ сделать редирект в Django
A)
def view(request):
return HttpResponseRedirect('/new_url/')
B)
def view(request):
resp = HttpResponse(content = '', status = 302)
resp['Location'] = '/new_url/'
return resp
C)
def view(request):
raise Http302('/new_url/')
D)
def view(request):
return request.redirect('/new_url/')
A
B
49. В каком из вариантов правильно определена Django форма?
A)
class AddArticleForm(forms.Form):
title = forms.CharField(max_length=80)
text = forms.TextField()
tags = forms.CharField()
def clean(self):
tags = self.cleaned_data.get('tags', '')
tags = [ t.trim() for t in tags.split(',') ]
if len(tags) < 2:
raise ValidationError('bad tags')
return tags
B)
class AddArticleForm(forms.Form):
title = forms.CharField(max_length=80)
text = forms.CharField(widget=forms.Textarea)
tags = forms.CharField()
def clean_tags(self):
tags = self.cleaned_data.get('tags', '')
tags = [ t.trim() for t in tags.split(',') ]
if len(tags) < 2:
raise ValidationError('bad tags')
return tags
C)
class AddArticleForm():
title = forms.CharField(max_length=80)
text = forms.CharField(widget=forms.Textarea)
tags = forms.CharField()
def clean(self):
tags = self.cleaned_data.get('tags', '')
tags = [ t.trim() for t in tags.split(',') ]
if len(tags) < 2:
raise ValidationError('bad tags')
return tags
D)
class AddArticleForm(forms.Form):
title = forms.CharField(max_length=80)
text = forms.CharField(widget=forms.Textarea)
tags = forms.CharField()
def clean(self):
tags = self.cleaned_data.get('tags', '')
tags = [ t.trim() for t in tags.split(',') ]
if len(tags) < 2:
return False
else:
self.cleaned_data['tags'] = tags
return True
B
50. Выберите правильные утверждения о связанных формах (bound forms) и формах моделей (model forms):
ModelForm — это форма сгенерированная на основе модели
BoundForm — это обычная форма, заполненная данными (например, из запроса)
51. При CSRF атаке злоумышленник:
Незаметно для пользователя совершает действия от лица этого же пользователя
52. Какой заголовок Authorization будем передан при Basic Http Authentication, если пользователь ввел логин user123 и пароль pass321 ?
Basic dXNlcjEyMzpwYXNzMzIx
53. Страница по адресу https://site.com/login/ устанавливает следующие куки
response.set_cookie('alpha', '1')
response.set_cookie('beta', '2', domain='.site.com')
response.set_cookie('gamma', '3', expires=datetime.now()-timedelta(days=30))
response.set_cookie('delta', '4', secure=True)
response.set_cookie('epsilon', '5', httponly=True)
Какие из этих кук будут присланы при последующем запросе по URL http://www.site.com/article/1 ?
beta
54. Какие методы могут быть определены у middleware классов в Django (1.8)?
process_request(request)
process_exception(request, exception)
55. При Cookie - based авторизации
Логин и пароль проверяются только при входе на сайт, в дальнейшем проверяется ID сессии
Сессия, может быть, даже у неавторизованных пользователей
56. Какой (нестандартный) HTTP заголовок часто добавляют JavaScript библиотеки при AJAX запросах?
X-Requested-With: XMLHttpRequest
57. Допустим в браузере загружена страница с URL https://site.com/
JavaScript код пытается выполнить AJAX запрос по URL https://api.com/
В чем заключается Same Origin Policy в данном случае?
Браузер выполнит AJAX запрос к api.com, но вместо результата JavaScript код получит ошибку
58. Допустим JavaScript код выполняет AJAX запрос к URL http://site.com/add_reply/
Логика сайта требует, чтобы для этого запроса (добавление комментария) пользователь был авторизован.
Каким образом можно сообщить об отсутвии авторизации неавторизованному пользователю, выполняющему такой AJAX запрос?
HTTP 404, тело ответа не важно. JavaScript должен обработать ошибку.
HTTP 200, в теле ответа указать ошибку, например { "error": "no_auth" }. JavaScript должен обработать ошибку.
59. Допустим разработчики сайта https://api.com/ хотят разрешить AJAX запросы с сайта https://site.com/ (но не для всех остальных). Какой заголовок они должны добавить к своим HTTP ответам?
Access-Control-Allow-Origin: https://site.com
60. Расположите технологии по среднему количеству осуществляемых HTTP запросов на одного пользователя в порядке убывания (первая строка - наибольшее число запросов):
Polling
Comet
WebSocket
61. Выберите правильные утверждения:
|
Polling |
Comet |
WebSocket |
Не требует дополнительного ПО |
✓ |
|
|
Поддерживает двустороннюю (full-duplex) передачу |
|
|
✓ |
Работает в любом браузере с поддержкой AJAX |
✓ |
✓ |
|
Позволяет одновременно обслуживать большое количество клиентов |
|
✓ |
✓ |
Минимизирует объем сетевого трафика |
|
|
✓ |
Работает с любыми proxy серверами |
✓ |
|
|
62. Выберите верные утверждения о технологии Comet (long-polling):
Используются обычные AJAX запросы
Получатель подключен к специальному Comet серверу, а отправитель - к обычному Application серверу
Получатель переподключается к Comet-серверу не реже чем раз в N (например 60) секунд
Вывод: в ходе курса научились разрабатывать приложения на языке python, использовать MVC фреймворки, изучили верстку HTML страниц, погрузились в тематику web-разработки и научились выбирать конкретные технологии.