Foros del Web » Programando para Internet » Python »

Python 2.7 + PyQt4 - Pasar HTML a tabla SQL

Estas en el tema de Python 2.7 + PyQt4 - Pasar HTML a tabla SQL en el foro de Python en Foros del Web. Buenas tengo el siguiente problema Estoy usando el QTextEdit que me permite modificar texto como si fuera un HTML y darle estilo al usar la ...
  #1 (permalink)  
Antiguo 15/06/2012, 14:56
 
Fecha de Ingreso: octubre-2010
Mensajes: 73
Antigüedad: 13 años, 4 meses
Puntos: 0
Pregunta Python 2.7 + PyQt4 - Pasar HTML a tabla SQL

Buenas tengo el siguiente problema

Estoy usando el QTextEdit que me permite modificar texto como si fuera un HTML y darle estilo

al usar la classe .toHtml() me transforma todo a HTML

Código:
 def modificar_anotacion(self):
        self.main_program.data_base.open()
        
        self.main_program.anotacion_pasar_texto_para_modificar =  self.main_program.textEdit_ver_anotaction.toHtml()
        
        self.main_program.anotacion_pasar_texto_para_modificar_a_string = self.main_program.anotacion_pasar_texto_para_modificar.toUtf8()
        
        print self.main_program.anotacion_pasar_texto_para_modificar_a_string
        
        self.main_program.anotacion_modificar.exec_("UPDATE os_anotaciones SET texto='"+ str (self.main_program.anotacion_pasar_texto_para_modificar_a_string) +"' WHERE nombre = '"+str (self.main_program.combo_box_texto_seleccionado) +"'")
Si uso self.main_program.anotacion_pasar_texto_para_modif icar = self.main_program.textEdit_ver_anotaction.toPlainT ext ()

me genera texto plano que facilmente puedo insertar en mi tabla mysql.

Quisiera saber como podria codificarlo para poner el resultado de HTML y poder traerlo despues, para poder manejar anotaciones de manera online por bases de datos

Si alguien se le ocurre :P.



Saludos.-
__________________
Página Principal: http://www.almightysystem.com.ar/
  #2 (permalink)  
Antiguo 15/06/2012, 16:25
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años
Puntos: 1360
Respuesta: Python 2.7 + PyQt4 - Pasar HTML a tabla SQL

aaaarrrggg!!! Queries con los parámetros hardcodeados. Nunca debes de hacer eso por que eres propenso a SQL injection. Lo mejor es parametrizar el query.

Para hacer "anotaciones" (quiero suponer que solo son propiedades para el tamaño del texto, color, estilo, imagentes, links, etc) puedes usar Markdown o BBcode.

Edito:
Si solo quieres insertar el html en la base de datos puedes parametrizar el query y realizar tu query normalmente.
  #3 (permalink)  
Antiguo 18/06/2012, 08:13
 
Fecha de Ingreso: octubre-2010
Mensajes: 73
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: Python 2.7 + PyQt4 - Pasar HTML a tabla SQL

Cita:
Iniciado por razpeitia Ver Mensaje
aaaarrrggg!!! Queries con los parámetros hardcodeados. Nunca debes de hacer eso por que eres propenso a SQL injection. Lo mejor es parametrizar el query.

Para hacer "anotaciones" (quiero suponer que solo son propiedades para el tamaño del texto, color, estilo, imagentes, links, etc) puedes usar Markdown o BBcode.

Edito:
Si solo quieres insertar el html en la base de datos puedes parametrizar el query y realizar tu query normalmente.
Si solo es ponerle estilo al texto que con QTextEdit de PyQT eso se puede y con la clase .toHtml() me genera el HTML del texto con los estilos.

Queria saber como podria hacer para guardar eso en una base de datos y luego traer la misma anotación.

Necesito usar algun otro script o que tipo parámetros deberia necesitar en el query?


Yo por el momento a la fila que debería contener el texto en HTML tiene

type: longtext
character set: utf8
__________________
Página Principal: http://www.almightysystem.com.ar/
  #4 (permalink)  
Antiguo 18/06/2012, 08:28
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años
Puntos: 1360
Respuesta: Python 2.7 + PyQt4 - Pasar HTML a tabla SQL

Lo que pasa es que el Richtext que maneja QTextEdit es básicamente es un subconjunto de html + el atributo style. Ver mas aquí.

Entonces lo que haces es guardar ese html en la base de datos y después ponerlo con el método setHTML.

Eso si, por favor no te olvides de parametrizar tu query por que si no vas a tener problemas.
  #5 (permalink)  
Antiguo 19/06/2012, 11:52
 
Fecha de Ingreso: octubre-2010
Mensajes: 73
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: Python 2.7 + PyQt4 - Pasar HTML a tabla SQL

Cita:
Iniciado por razpeitia Ver Mensaje
Lo que pasa es que el Richtext que maneja QTextEdit es básicamente es un subconjunto de html + el atributo style. Ver mas aquí.

Entonces lo que haces es guardar ese html en la base de datos y después ponerlo con el método setHTML.

Eso si, por favor no te olvides de parametrizar tu query por que si no vas a tener problemas.
Insertandolo manualmente en la tabla

Código:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">holatextooaaa</p></body></html>
Y al traerlo se imprime perfecto sin usar SetHTML

Código:
    def traer_anotacion(self):
        self.main_program.combo_box_texto_seleccionado = self.main_program.comboBox_anotaciones.currentText()
        print self.main_program.combo_box_texto_seleccionado
        
        self.main_program.mostrar_la_anotacion = QtSql.QSqlQuery()
        self.main_program.mostrar_la_anotacion.exec_("SELECT texto FROM os_anotaciones where nombre='"+ str (self.main_program.combo_box_texto_seleccionado)+"'")
        print (self.main_program.mostrar_la_anotacion.numRowsAffected())
        
        while(self.main_program.mostrar_la_anotacion.next()):
            self.main_program.resultado_del_query_al_linedit = self.main_program.mostrar_la_anotacion.value(0).toString()
            self.main_program.textEdit_ver_anotaction.setText(str (self.main_program.resultado_del_query_al_linedit))



No encuentro la forma de insertar el HTML en la tabla

Y que seria parametrizar el query?




Gracias.-
__________________
Página Principal: http://www.almightysystem.com.ar/
  #6 (permalink)  
Antiguo 19/06/2012, 15:40
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años
Puntos: 1360
Respuesta: Python 2.7 + PyQt4 - Pasar HTML a tabla SQL

No he manejado PyQT4 como pero checando la documentación me salio este ejemplo.

Código C++:
Ver original
  1. QSqlQuery query;
  2. query.prepare("INSERT INTO person (id, forename, surname) "
  3.                    "VALUES (:id, :forename, :surname)");
  4. query.bindValue(":id", 1001);
  5. query.bindValue(":forename", "Bart");
  6. query.bindValue(":surname", "Simpson");
  7. query.exec();

Supongo que en PyQt4 debe de ser muy parecido.
  #7 (permalink)  
Antiguo 21/06/2012, 06:12
 
Fecha de Ingreso: octubre-2010
Mensajes: 73
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: Python 2.7 + PyQt4 - Pasar HTML a tabla SQL

Cita:
Iniciado por razpeitia Ver Mensaje
No he manejado PyQT4 como pero checando la documentación me salio este ejemplo.

Código C++:
Ver original
  1. QSqlQuery query;
  2. query.prepare("INSERT INTO person (id, forename, surname) "
  3.                    "VALUES (:id, :forename, :surname)");
  4. query.bindValue(":id", 1001);
  5. query.bindValue(":forename", "Bart");
  6. query.bindValue(":surname", "Simpson");
  7. query.exec();

Supongo que en PyQt4 debe de ser muy parecido.

Claro pero con pyqt4 es más corto. así :

Código:
    def modificar_anotacion(self):
        self.main_program.data_base.open()
        
        self.main_program.anotacion_pasar_texto_para_modificar =  self.main_program.textEdit_ver_anotaction.toHtml()
        
        self.main_program.anotacion_pasar_texto_para_modificar_a_string = str (self.main_program.anotacion_pasar_texto_para_modificar.toUtf8())
        
        print self.main_program.anotacion_pasar_texto_para_modificar_a_string
        
        self.main_program.anotacion_modificar.exec_("UPDATE os_anotaciones SET texto='"+ str (self.main_program.anotacion_pasar_texto_para_modificar_a_string) +"' WHERE nombre = '"+ str (self.main_program.combo_box_texto_seleccionado) +"'")
Agregando, actualizando, sacando, trayendo tablas, todo eso voy perfecto (en texto plano).

Pero al agregar el HTML es el problema, no me lo inserta.

Si lo transformo en texto plano me lo inserta perfectamente, pero cuando quiero agregar el resultado en html no me da ni bola =/

No me da ningun error, solo no lo inserta.

La tabla tiene

type: longtext
character set: utf8
__________________
Página Principal: http://www.almightysystem.com.ar/

Última edición por Onsterion; 21/06/2012 a las 06:40
  #8 (permalink)  
Antiguo 21/06/2012, 10:59
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años
Puntos: 1360
Respuesta: Python 2.7 + PyQt4 - Pasar HTML a tabla SQL

Ya hablamos del parametrizado de queries, por que sigues concatenando los valores al query. Eso habla muy mal como programador de ti.

Ademas si no te lo inserta es lo mismo, por que concatenas los valores.
  #9 (permalink)  
Antiguo 21/06/2012, 12:02
 
Fecha de Ingreso: octubre-2010
Mensajes: 73
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: Python 2.7 + PyQt4 - Pasar HTML a tabla SQL

Cita:
Iniciado por razpeitia Ver Mensaje
Ya hablamos del parametrizado de queries, por que sigues concatenando los valores al query. Eso habla muy mal como programador de ti.

Ademas si no te lo inserta es lo mismo, por que concatenas los valores.
Soy re mal programador posta.

Te pregunte a que le llamabas parametrizar y seguis sin responder. Si sos tan capo master programador, explicalo y punto

Bueno encontre la vuelta por otro lado ya que por ahora todos los posts que hice tu ayuda de poco y nada útil, quizas a alguien le sirva.

Para insertarlo, use el modulo CGI y lo modifique en la linea 1031

Código:
def escape(s, quote=None):
    '''Replace special characters "&", "<" and ">" to HTML-safe sequences.
    If the optional flag quote is true, the quotation mark character (")
    is also translated.'''
    s = s.replace("&", "&amp;") # Must be done first!
    s = s.replace("<", "&lt;")
    s = s.replace(">", "&gt;")
    s = s.replace('"', "&quot;")
    s = s.replace("'", "&apos;")
    if quote:
        s = s.replace('"', "&quot;")
    return s
Y agrege otra función:

Código:
def enco_escape(s, quote=None):
    '''Replace special characters "&", "<" and ">" to HTML-safe sequences.
    If the optional flag quote is true, the quotation mark character (")
    is also translated.'''
    s = s.replace("&amp;", "&") # Must be done first!
    s = s.replace("&lt;", "<")
    s = s.replace("&gt;", ">")
    s = s.replace("&quot;", '"')
    s = s.replace("&apos;", "'")
    if quote:
        s = s.replace('"', "&quot;")
    return s
Luego para insertar:

Código:
    def modificar_anotacion(self):

        self.main_program.data_base.open()
        
        self.main_program.anotacion_pasar_texto_para_modificar =  self.main_program.textEdit_ver_anotaction.toHtml()
        
        self.main_program.anotacion_pasar_texto_para_modificar_a_string =  cgi.escape (self.main_program.anotacion_pasar_texto_para_modificar)
        
        try:
            self.main_program.anotacion_modificar.exec_("UPDATE os_anotaciones SET texto='" " " + str  (self.main_program.anotacion_pasar_texto_para_modificar_a_string) +" " "' WHERE nombre = '"+ str (self.main_program.combo_box_texto_seleccionado) +"'")
        except:
            print "Error"
Y para traer:

Código:
    def traer_anotacion(self):
        self.main_program.data_base.open()
        
        self.main_program.combo_box_texto_seleccionado = self.main_program.comboBox_anotaciones.currentText()
        print self.main_program.combo_box_texto_seleccionado
        
        self.main_program.mostrar_la_anotacion = QtSql.QSqlQuery()
        self.main_program.mostrar_la_anotacion.exec_("SELECT texto FROM os_anotaciones where nombre='"+ str (self.main_program.combo_box_texto_seleccionado)+"'")
        print (self.main_program.mostrar_la_anotacion.numRowsAffected())
        
        #Traigo el resultado del query para imprimir
        while(self.main_program.mostrar_la_anotacion.next()):
            self.main_program.resultado_del_query_al_linedit = str (self.main_program.mostrar_la_anotacion.value(0).toString())
            self.main_program.resultado_del_query_al_linedit = cgi.enco_escape (self.main_program.resultado_del_query_al_linedit)
            self.main_program.textEdit_ver_anotaction.setText(self.main_program.resultado_del_query_al_linedit)

O más sencillo y manual:

Código:
self.main_program.anotacion_pasar_texto_para_modificar_a_string = self.main_program.anotacion_pasar_texto_para_modificar_a_string.replace(">", "&gt;")

Espero que a alguien más le sirva.




Saludos.-
__________________
Página Principal: http://www.almightysystem.com.ar/

Última edición por razpeitia; 21/06/2012 a las 20:43 Razón: "sencillo" es con "c"
  #10 (permalink)  
Antiguo 21/06/2012, 20:42
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años
Puntos: 1360
Respuesta: Python 2.7 + PyQt4 - Pasar HTML a tabla SQL

Wow sin duda los malos programadores seguirán siendo malos programadores no importa el lenguaje o el framework que estén usando.

No puedo creer que aun con el link a la documentación y ejemplo en QT en C++ no puedas parametrizar un query.

Realmente no tiene ciencia ademas es mucho mas elegante y funcional que concatenar valores a un query. Ciertamente los malos hábitos son difíciles de matar. Espero que cuando se encuentren con una vulnerabilidad de sql injection aprendas la lección.

Etiquetas: 2.7, code, html, pyqt4, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:59.