Commit 45e1ea95 authored by AntonKras's avatar AntonKras
Browse files

добавление баннера при редиректе, вывод соответствий на экран, json

parent c911e014
...@@ -18,10 +18,10 @@ ...@@ -18,10 +18,10 @@
**Функции:** **Функции:**
- main - функция рендерит index.html; - main - функция рендерит index.html;
- add - функция добавляет новое соответствие; - add - функция добавляет новое соответствие и возращает Response;
- redirect_somewhere - функция осуществляет перенаправление в зависимости от соответствия {short_url: long_url}. - redirect_somewhere - функция осуществляет перенаправление в зависимости от соответствия {short_url: long_url}.
Возвращает 404, если соответствия не существует; Возвращает 404, если соответствия не существует;
- extract_data_from_yml - функция извлекает данные из yml файла; - extract_data_from_yml_and_load_to_redis - функция извлекает данные из yml файла и загружает в redis;
- generate_short_url - функция генерирует короткий url; - generate_short_url - функция генерирует короткий url;
- check_if_input_is_url - функция проверяет является ли ссылка ссылкой; - check_if_input_is_url - функция проверяет является ли ссылка ссылкой;
- normalize - функция нормализует url - normalize - функция нормализует url
...@@ -31,3 +31,9 @@ ...@@ -31,3 +31,9 @@
Для создания необходимо ввести команду: Для создания необходимо ввести команду:
`python -m pydoc -w app` `python -m pydoc -w app`
**Тесты**
Для запуска тестов необходимо написать
`python tests.py`
\ No newline at end of file
...@@ -17,20 +17,21 @@ ...@@ -17,20 +17,21 @@
<font color="#ffffff" face="helvetica, arial"><big><strong>Modules</strong></big></font></td></tr> <font color="#ffffff" face="helvetica, arial"><big><strong>Modules</strong></big></font></td></tr>
<tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td> <tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="os.html">os</a><br> <td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="json.html">json</a><br>
<a href="re.html">re</a><br> <a href="os.html">os</a><br>
</td><td width="25%" valign=top><a href="redis.html">redis</a><br> </td><td width="25%" valign=top><a href="re.html">re</a><br>
<a href="sys.html">sys</a><br> <a href="redis.html">redis</a><br>
</td><td width="25%" valign=top><a href="uuid.html">uuid</a><br> </td><td width="25%" valign=top><a href="sys.html">sys</a><br>
<a href="yaml.html">yaml</a><br> <a href="uuid.html">uuid</a><br>
</td><td width="25%" valign=top></td></tr></table></td></tr></table><p> </td><td width="25%" valign=top><a href="yaml.html">yaml</a><br>
</td></tr></table></td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section"> <table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#eeaa77"> <tr bgcolor="#eeaa77">
<td colspan=3 valign=bottom>&nbsp;<br> <td colspan=3 valign=bottom>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr> <font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td> <tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><dl><dt><a name="-add"><strong>add</strong></a>() -&gt; &lt;function redirect at 0x000000000307C268&gt;</dt><dd><tt>функция&nbsp;добавления&nbsp;соответствия&nbsp;в&nbsp;redis<br> <td width="100%"><dl><dt><a name="-add"><strong>add</strong></a>() -&gt; flask.wrappers.Response</dt><dd><tt>функция&nbsp;добавления&nbsp;соответствия&nbsp;в&nbsp;redis<br>
:return&nbsp;redirect(перенаправление&nbsp;на&nbsp;главную&nbsp;страницу):</tt></dd></dl> :return&nbsp;redirect(перенаправление&nbsp;на&nbsp;главную&nbsp;страницу):</tt></dd></dl>
<dl><dt><a name="-check_if_input_is_url"><strong>check_if_input_is_url</strong></a>(url) -&gt; True</dt><dd><tt>проверка&nbsp;ссылку&nbsp;на&nbsp;валидность<br> <dl><dt><a name="-check_if_input_is_url"><strong>check_if_input_is_url</strong></a>(url) -&gt; True</dt><dd><tt>проверка&nbsp;ссылку&nbsp;на&nbsp;валидность<br>
:param&nbsp;ссылка:<br> :param&nbsp;ссылка:<br>
...@@ -45,7 +46,7 @@ ...@@ -45,7 +46,7 @@
<dl><dt><a name="-normalize"><strong>normalize</strong></a>(url: str) -&gt; str</dt><dd><tt>нормализация&nbsp;ссылки<br> <dl><dt><a name="-normalize"><strong>normalize</strong></a>(url: str) -&gt; str</dt><dd><tt>нормализация&nbsp;ссылки<br>
:param&nbsp;ссылка:<br> :param&nbsp;ссылка:<br>
:return&nbsp;нормализованная&nbsp;ссылка:</tt></dd></dl> :return&nbsp;нормализованная&nbsp;ссылка:</tt></dd></dl>
<dl><dt><a name="-redirect_somewhere"><strong>redirect_somewhere</strong></a>(path) -&gt; &lt;function redirect at 0x000000000307C268&gt;</dt><dd><tt>функция&nbsp;перенаправляет&nbsp;пользователя&nbsp;на&nbsp;соответствующую&nbsp;короткой&nbsp;ссылке&nbsp;страницу<br> <dl><dt><a name="-redirect_somewhere"><strong>redirect_somewhere</strong></a>(path) -&gt; &lt;function redirect at 0x000000000307A400&gt;</dt><dd><tt>функция&nbsp;перенаправляет&nbsp;пользователя&nbsp;на&nbsp;соответствующую&nbsp;короткой&nbsp;ссылке&nbsp;страницу<br>
:param&nbsp;path&nbsp;(передается&nbsp;часть&nbsp;ссылки&nbsp;после&nbsp;/):<br> :param&nbsp;path&nbsp;(передается&nbsp;часть&nbsp;ссылки&nbsp;после&nbsp;/):<br>
:return&nbsp;redirect&nbsp;or&nbsp;404&nbsp;Error:</tt></dd></dl> :return&nbsp;redirect&nbsp;or&nbsp;404&nbsp;Error:</tt></dd></dl>
</td></tr></table><p> </td></tr></table><p>
...@@ -57,5 +58,6 @@ ...@@ -57,5 +58,6 @@
<tr><td bgcolor="#55aa55"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td> <tr><td bgcolor="#55aa55"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><strong>app</strong> = &lt;Flask 'app'&gt;<br> <td width="100%"><strong>app</strong> = &lt;Flask 'app'&gt;<br>
<strong>count</strong> = 0<br> <strong>count</strong> = 0<br>
<strong>r</strong> = Redis&lt;ConnectionPool&lt;Connection&lt;host=localhost,port=6379,db=0&gt;&gt;&gt;<br>
<strong>request</strong> = &lt;LocalProxy unbound&gt;</td></tr></table> <strong>request</strong> = &lt;LocalProxy unbound&gt;</td></tr></table>
</body></html> </body></html>
\ No newline at end of file
from flask import Flask, render_template, redirect, request, abort, flash, url_for from flask import Flask, render_template, redirect, request, abort, flash, url_for, Response, jsonify
import re, os, yaml, redis, sys import re, os, yaml, redis, sys
import uuid import uuid
from url_normalize import url_normalize from url_normalize import url_normalize
import json
app = Flask(__name__) app = Flask(__name__)
app.secret_key = os.urandom(24) app.secret_key = os.urandom(24)
...@@ -18,14 +19,14 @@ def main(): ...@@ -18,14 +19,14 @@ def main():
global count global count
count += 1 count += 1
if count == 1: # если первый вход, то читаем из yml и загружаем в redis if count == 1: # если первый вход, то читаем из yml и загружаем в redis
# auth_redis()
# r.flushall()
extract_yml_data_and_load_to_redis(sys.argv[1]) extract_yml_data_and_load_to_redis(sys.argv[1])
return render_template('index.html') # рендер шаблона
final_dict = r.hgetall('urls_dict') # достаем словарь из redis и передаем в шаблон
return render_template('index.html', final_dict=final_dict) # рендер шаблона
@app.route('/add', methods=['GET', 'POST']) @app.route('/add', methods=['GET', 'POST'])
def add() -> redirect: def add() -> Response:
""" """
функция добавления соответствия в redis функция добавления соответствия в redis
:return redirect(перенаправление на главную страницу): :return redirect(перенаправление на главную страницу):
...@@ -37,9 +38,12 @@ def add() -> redirect: ...@@ -37,9 +38,12 @@ def add() -> redirect:
else: else:
short_url = generate_short_url() short_url = generate_short_url()
data = {short_url: url} data = {short_url: url}
print(data) # r.mset(data)
r.mset(data) r.hmset('urls_dict', data)
return redirect(url_for('main'))
json_dict = {"url": '/' + short_url}
# return redirect(url_for('main'))
return Response(json.dumps(json_dict), status=200, mimetype='application/json')
@app.route('/<path:path>') @app.route('/<path:path>')
...@@ -50,8 +54,10 @@ def redirect_somewhere(path) -> redirect: ...@@ -50,8 +54,10 @@ def redirect_somewhere(path) -> redirect:
:return redirect or 404 Error: :return redirect or 404 Error:
""" """
if r.get(path) != None: urls_dict = r.hgetall("urls_dict")
return redirect(normalize(r.get(path))) if urls_dict.get(path) != None:
redirected_url = normalize(urls_dict.get(path))
return render_template('before_redirect.html', redirected_url=redirected_url)
else: else:
return abort(404) return abort(404)
...@@ -69,10 +75,11 @@ def extract_yml_data_and_load_to_redis(urls) -> None: ...@@ -69,10 +75,11 @@ def extract_yml_data_and_load_to_redis(urls) -> None:
final_dict = yaml.safe_load(stream) # загрузка данных в словарь final_dict = yaml.safe_load(stream) # загрузка данных в словарь
except yaml.YAMLError as exc: # обработка исключения except yaml.YAMLError as exc: # обработка исключения
print(exc) print(exc)
# печать словаря в консоли # # печать словаря в консоли
for key, value in final_dict.items(): # for key, value in final_dict.items():
print(key + ":" + value) # print(key + ":" + value)
r.mset(final_dict) # загрузить в redis # r.mset(final_dict) # загрузить в redis
r.hmset("urls_dict", final_dict)
def generate_short_url() -> str: def generate_short_url() -> str:
......
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<meta http-equiv="refresh" content="3;url={{ redirected_url }}" />
</head>
<body>
<h1>Тут могла быть ваша реклама</h1>
<img src="/static/london.jpg"/>
</body>
</html>
\ No newline at end of file
...@@ -19,5 +19,9 @@ ...@@ -19,5 +19,9 @@
{% endif %} {% endif %}
{% endwith %} {% endwith %}
</form> </form>
{% for key in final_dict %}
{{ key + ':' + final_dict[key]}}<br/>
{% endfor %}
</body> </body>
</html> </html>
\ No newline at end of file
...@@ -39,7 +39,7 @@ class TestPageLoad(unittest.TestCase): ...@@ -39,7 +39,7 @@ class TestPageLoad(unittest.TestCase):
""" """
tester = app.test_client(self) tester = app.test_client(self)
response = tester.get('/yah44', content_type='html/text') response = tester.get('/yah44', content_type='html/text')
self.assertEqual(response.status_code, 302) self.assertEqual(response.status_code, 200)
def test_post_wrong_long_url(self): def test_post_wrong_long_url(self):
""" """
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment