Форум программистов, компьютерный форум CyberForum.ru

Python: Web

Войти
Регистрация
Восстановить пароль
 
Ennjin
62 / 62 / 24
Регистрация: 25.11.2016
Сообщений: 199
#1

Подсветка синтаксиса flask - Python

01.01.2017, 18:25. Просмотров 248. Ответов 9
Метки нет (Все метки)

Всем привет. Нужно реализовать подсветку синтаксиса на сайте(как на киберфоруме, например) написанном на flask. Гугл приводит меня к markdown. Но при его использовании подсвечивается весь текст. Пытался сделать при помощи highlight.js, но тоже не вышло.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2452 / 1624 / 238
Регистрация: 24.11.2012
Сообщений: 3,999
01.01.2017, 18:56     Подсветка синтаксиса flask #2
Цитата Сообщение от Ennjin Посмотреть сообщение
Пытался сделать при помощи highlight.js, но тоже не вышло.
Что конкретно не получилось? Обязательно рендерить на серверной стороне? При чем тут flask? Смотрели на pygments?
Ennjin
62 / 62 / 24
Регистрация: 25.11.2016
Сообщений: 199
01.01.2017, 19:09  [ТС]     Подсветка синтаксиса flask #3
Цитата Сообщение от 0x10 Посмотреть сообщение
Что конкретно не получилось?
Подключил стили и js файл. Попытался добавить запись, в форме нужный текст обернул в теги, но в итоге теги были проигнорированы и запись добавилась как есть.
Цитата Сообщение от 0x10 Посмотреть сообщение
Обязательно рендерить на серверной стороне?
Мне без разницы как сделать это.
0x10
2452 / 1624 / 238
Регистрация: 24.11.2012
Сообщений: 3,999
01.01.2017, 20:08     Подсветка синтаксиса flask #4
Цитата Сообщение от Ennjin Посмотреть сообщение
Подключил стили и js файл. Попытался добавить запись, в форме нужный текст обернул в теги, но в итоге теги были проигнорированы и запись добавилась как есть.
Это не техническое описание проблемы, а «я все сделал, ничего не работает». Минимальный самодостаточный пример? Вывод в консоль?

Вот простейший пример:
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title></title>
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.9.0/styles/default.min.css">
  <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.9.0/highlight.min.js"></script>
</head>
<body>
  <pre><code class="python">
  @decor
  def foo(*args, **kwargs):
      pass
  </code></pre>
  <script>hljs.initHighlightingOnLoad();</script>
</body>
</html>
А дальше уже можно смотреть: удобно так или нет.
Ennjin
62 / 62 / 24
Регистрация: 25.11.2016
Сообщений: 199
01.01.2017, 20:33  [ТС]     Подсветка синтаксиса flask #5
Вот простейший пример:
Вот как у меня
Сделал все точно также, как у вас.
Причем если текст тупо вставить в шаблон, то все работает отлично, но если текст идет с бд, то получается как на скриншоте.
0x10
2452 / 1624 / 238
Регистрация: 24.11.2012
Сообщений: 3,999
01.01.2017, 20:47     Подсветка синтаксиса flask #6
Цитата Сообщение от Ennjin Посмотреть сообщение
но если текст идет с бд, то получается как на скриншоте.
Ну вот непонятно, как ставить диагноз по фотографии. Возможно, на каком-то этапе симводы < и > заменяются на &lt; и &gt;. Как исходник хранится в базе? Вместе с тегами pre и code? В каком виде попадает в шаблон? Посмотреть промежуточный результат каждого этапа, понять, где выполняется эскейпинг (если он есть).
Ennjin
62 / 62 / 24
Регистрация: 25.11.2016
Сообщений: 199
01.01.2017, 21:12  [ТС]     Подсветка синтаксиса flask #7
Цитата Сообщение от 0x10 Посмотреть сообщение
Как исходник хранится в базе?
Запись в базу:
Получаю данные из формы и присваиваю переменной.
Python
1
txt = request.form['txt'].strip()
Затем sql запросом записываю в базу
Python
1
c.execute('INSERT INTO posts(txt) VALUE(?), txt')
Цитата Сообщение от 0x10 Посмотреть сообщение
В каком виде попадает в шаблон?
Вывод в шаблон:
Собирается все в один список
Python
1
posts = [dict(tilte = row[0], txt = row[1]'''и так далее''') for row in c.fetchall]
В шаблон выводится так.
Python
1
2
3
4
{% for post in posts %}
post.txt
post.title
{% endfor %}
Цитата Сообщение от 0x10 Посмотреть сообщение
Как исходник хранится в базе? Вместе с тегами pre и code?
Да. вместе с тегами, символы <> остаются символами.
0x10
2452 / 1624 / 238
Регистрация: 24.11.2012
Сообщений: 3,999
01.01.2017, 21:49     Подсветка синтаксиса flask #8
Цитата Сообщение от Ennjin Посмотреть сообщение
символы <> остаются символами.
Тогда почему они отображаются в отрендеренной странице?

Еще раз:
Цитата Сообщение от 0x10 Посмотреть сообщение
Минимальный самодостаточный пример?
По фрагментам кода, который даже не запустить, сложно что-либо сказать. Убрать все лишнее, получить минимальный пример. Затем искать, чем минимальный пример отличается от кода, в котором воспроизводится проблема.

По шагам.

1. Создаем базу и таблицу. Использовать будем SQLite.

Код
$ sqlite3 --version
3.11.0 2016-02-15 17:29:24 3d862f207e3adc00f78066799ac5a8c282430a5f
Файл init.sql:
SQL
1
2
3
4
5
6
CREATE TABLE posts (
    text TEXT
);
 
INSERT INTO posts (text) VALUES ('<pre><code class="python">def hello(): pass</code></pre>');
INSERT INTO posts (text) VALUES ('<pre><code class="c">printf("Hello\n");</code></pre>');
Запускаем:
Код
$ sqlite3 data.db < init.sql
Смотрим содержимое базы:
Код
$ sqlite3 data.db
sqlite> select * from posts;
<pre><code class="python">def hello(): pass</code></pre>
<pre><code class="c">printf("Hello\n");</code></pre>
Все на месте

2. Готовим код для проверки:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import sqlite3
from jinja2 import Template
 
 
template_text = """
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.9.0/styles/default.min.css">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.9.0/highlight.min.js"></script>
</head>
<body>
    {% for post in posts %}
    {{ post }}
    {% endfor %}
    <script>hljs.initHighlightingOnLoad();</script>
</body>
</html>
"""
 
source_code = """
    <pre><code class="python">print('Hello!')</code></pre>
"""
 
conn = sqlite3.connect('data.db')
c = conn.cursor()
c.execute('SELECT text FROM posts')
 
posts = [row[0] for row in c.fetchall()]
 
template = Template(template_text)
print(template.render(posts=posts))
Запускаем:
Код
$ python3 render.py

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.9.0/styles/default.min.css">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.9.0/highlight.min.js"></script>
</head>
<body>
    
    <pre><code class="python">def hello(): pass</code></pre>
    
    <pre><code class="c">printf("Hello\n");</code></pre>
    
    <script>hljs.initHighlightingOnLoad();</script>
</body>
</html>
Видим, что проблема не воспроизводится. А теперь ищем принципиальные отличия от проблемного кода.
Ennjin
62 / 62 / 24
Регистрация: 25.11.2016
Сообщений: 199
01.01.2017, 22:39  [ТС]     Подсветка синтаксиса flask #9
Цитата Сообщение от 0x10 Посмотреть сообщение
Видим, что проблема не воспроизводится. А теперь ищем принципиальные отличия от проблемного кода.
Три раза перепроверил. Отличий нет.
Цитата Сообщение от 0x10 Посмотреть сообщение
$ sqlite3 data.db
sqlite> select * from posts;
<pre><code class="python">def hello(): pass</code></pre>
<pre><code class="c">printf("Hello\n");</code></pre>
Хранится все в таком же виде.

Может проблема в функции фласка render_template()?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.01.2017, 10:34     Подсветка синтаксиса flask
Еще ссылки по теме:

Ajax подгрузка графа networkx из flask Python
Flask: Личные сообщения Python
Flask так сказать изучаю "мега туториал flask" строка "from app import app" Python
Python Flask ldap
WTform(SelectField) flask python Python

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
0x10
2452 / 1624 / 238
Регистрация: 24.11.2012
Сообщений: 3,999
02.01.2017, 10:34     Подсветка синтаксиса flask #10
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Ennjin Посмотреть сообщение
Может проблема в функции фласка render_template()?
Решение — оборачивать строки с разметкой в flask.Markup.
Yandex
Объявления
02.01.2017, 10:34     Подсветка синтаксиса flask
Ответ Создать тему
Опции темы

Текущее время: 14:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru