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

Python: Web

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

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

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

Всем привет. Нужно реализовать подсветку синтаксиса на сайте(как на киберфоруме, например) написанном на flask. Гугл приводит меня к markdown. Но при его использовании подсвечивается весь текст. Пытался сделать при помощи highlight.js, но тоже не вышло.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.01.2017, 18:25     Подсветка синтаксиса flask
Посмотрите здесь:

Путь до Flask'a - Python
Что необходимо изучить или как правильно поставить путь до Flask/Django, чтобы более менее комфортно разрабатывать что-то не сложное? ...

Flask ldap - Python
Приветствую! Имеется приложение на python3 flask, которое использует модуль ldap3. В процессе работы идет запрос к LDAP, а в ответ...

Flask: Личные сообщения - Python
Здравствуйте форумчане. Нужна помощь. Я делаю своеобразную соц.сеть на Flask и столкнулся с проблемой, что пользователи не могут увидеть...

Привязка Flask к домену - Python
Работаю через консоль (VDS), в панели привязал site.ru и теперь во время установки по инструкции надо создать папку $ mkdir myproject ...

Flask как установить на windows? - Python
всё установил, обновил и pip и setuptools но пишет после команды virtualenv venv это в конце

WTform(SelectField) flask python - Python
Добрый вечер товарищи, а кому-то добрый день! Пытаюсь добавить select box к своей форме на flask, но не знаю как переделать мою html-ку...

Не взлетает тест приложения на Flask - Python
Приветствую, коллеги! Пытаюсь освоить Flask по вот этой мурзилке (M.Grinberg). Создал приложение в hello.py, дошло дело до...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
01.01.2017, 18:56     Подсветка синтаксиса flask #2
Цитата Сообщение от Ennjin Посмотреть сообщение
Пытался сделать при помощи highlight.js, но тоже не вышло.
Что конкретно не получилось? Обязательно рендерить на серверной стороне? При чем тут flask? Смотрели на pygments?
Ennjin
71 / 71 / 28
Регистрация: 25.11.2016
Сообщений: 228
01.01.2017, 19:09  [ТС]     Подсветка синтаксиса flask #3
Цитата Сообщение от 0x10 Посмотреть сообщение
Что конкретно не получилось?
Подключил стили и js файл. Попытался добавить запись, в форме нужный текст обернул в теги, но в итоге теги были проигнорированы и запись добавилась как есть.
Цитата Сообщение от 0x10 Посмотреть сообщение
Обязательно рендерить на серверной стороне?
Мне без разницы как сделать это.
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
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
71 / 71 / 28
Регистрация: 25.11.2016
Сообщений: 228
01.01.2017, 20:33  [ТС]     Подсветка синтаксиса flask #5
Вот простейший пример:
Вот как у меня
Сделал все точно также, как у вас.
Причем если текст тупо вставить в шаблон, то все работает отлично, но если текст идет с бд, то получается как на скриншоте.
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
01.01.2017, 20:47     Подсветка синтаксиса flask #6
Цитата Сообщение от Ennjin Посмотреть сообщение
но если текст идет с бд, то получается как на скриншоте.
Ну вот непонятно, как ставить диагноз по фотографии. Возможно, на каком-то этапе симводы < и > заменяются на &lt; и &gt;. Как исходник хранится в базе? Вместе с тегами pre и code? В каком виде попадает в шаблон? Посмотреть промежуточный результат каждого этапа, понять, где выполняется эскейпинг (если он есть).
Ennjin
71 / 71 / 28
Регистрация: 25.11.2016
Сообщений: 228
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
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
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
71 / 71 / 28
Регистрация: 25.11.2016
Сообщений: 228
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
Добрый вечер, товарищи! Недавно начал изучение networkx/flask, столкнулся с задачей написания динамической(с ajax) подгрузкой графа на...

Flask. Отдача файлов с русскоязычным названием - Python
Нужно отдавать csv- файлы. Название - кирилицей, содержимое - тоже кирилицей. Исходная кодировка - utf8. Питон 3. Установка дополнительных...

Не работает hello world, простейший пример на flask - Python
from flask import Flask, render_template import os app = Flask(__name__) @app.route('/') def root(): return...

Flask голосовалака: почему здесь ошибка? - Python
# coding: utf8 from flask import Flask, render_template, request import os app = Flask(__name__) poll_data = { ...

Обьясните на пальцах что такое Django/flask - Python
Здравствуйте, создал десяток сайтов на джумле, знаю что и как вставлять, править, плагины, модули и т.д. но нужно двигаться далее,...


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

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

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