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

Python: Web

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

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

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

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

Flask так сказать изучаю "мега туториал flask" строка "from app import app" - Python
Объясните что всё это означает? Почему app подчеркнуто красным? В чём ошибка?

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

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

Разрешение на редактирование Flask - Python
Добрый день! Имеется приложение на Flask. В нем есть View (аккаунт). Как сделать так, чтобы все пользователи могли просматривать...

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

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

9
0x10
2465 / 1637 / 241
Регистрация: 24.11.2012
Сообщений: 4,039
01.01.2017, 18:56 #2
Цитата Сообщение от Ennjin Посмотреть сообщение
Пытался сделать при помощи highlight.js, но тоже не вышло.
Что конкретно не получилось? Обязательно рендерить на серверной стороне? При чем тут flask? Смотрели на pygments?
0
Ennjin
73 / 73 / 29
Регистрация: 25.11.2016
Сообщений: 247
01.01.2017, 19:09  [ТС] #3
Цитата Сообщение от 0x10 Посмотреть сообщение
Что конкретно не получилось?
Подключил стили и js файл. Попытался добавить запись, в форме нужный текст обернул в теги, но в итоге теги были проигнорированы и запись добавилась как есть.
Цитата Сообщение от 0x10 Посмотреть сообщение
Обязательно рендерить на серверной стороне?
Мне без разницы как сделать это.
0
0x10
2465 / 1637 / 241
Регистрация: 24.11.2012
Сообщений: 4,039
01.01.2017, 20:08 #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>
А дальше уже можно смотреть: удобно так или нет.
0
Ennjin
73 / 73 / 29
Регистрация: 25.11.2016
Сообщений: 247
01.01.2017, 20:33  [ТС] #5
Вот простейший пример:
Вот как у меня
Сделал все точно также, как у вас.
Причем если текст тупо вставить в шаблон, то все работает отлично, но если текст идет с бд, то получается как на скриншоте.
0
0x10
2465 / 1637 / 241
Регистрация: 24.11.2012
Сообщений: 4,039
01.01.2017, 20:47 #6
Цитата Сообщение от Ennjin Посмотреть сообщение
но если текст идет с бд, то получается как на скриншоте.
Ну вот непонятно, как ставить диагноз по фотографии. Возможно, на каком-то этапе симводы < и > заменяются на &lt; и &gt;. Как исходник хранится в базе? Вместе с тегами pre и code? В каком виде попадает в шаблон? Посмотреть промежуточный результат каждого этапа, понять, где выполняется эскейпинг (если он есть).
0
Ennjin
73 / 73 / 29
Регистрация: 25.11.2016
Сообщений: 247
01.01.2017, 21:12  [ТС] #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?
Да. вместе с тегами, символы <> остаются символами.
0
0x10
2465 / 1637 / 241
Регистрация: 24.11.2012
Сообщений: 4,039
01.01.2017, 21:49 #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>
Видим, что проблема не воспроизводится. А теперь ищем принципиальные отличия от проблемного кода.
0
Ennjin
73 / 73 / 29
Регистрация: 25.11.2016
Сообщений: 247
01.01.2017, 22:39  [ТС] #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()?
0
0x10
2465 / 1637 / 241
Регистрация: 24.11.2012
Сообщений: 4,039
02.01.2017, 10:34 #10
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Ennjin Посмотреть сообщение
Может проблема в функции фласка render_template()?
Решение — оборачивать строки с разметкой в flask.Markup.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.01.2017, 10:34
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
10
Yandex
Объявления
02.01.2017, 10:34
Ответ Создать тему
Опции темы

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