Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Spanish: Corrections to chapter 14 (translation style and some spell-…

…checking)
  • Loading branch information...
commit a64ad53b4f14fcb181b916ceaa820357d31854d4 1 parent 7145134
@spametki spametki authored
Showing with 176 additions and 157 deletions.
  1. +2 −2 sources/36-web2py-spanish-translation-in-progress/04.markmin
  2. +1 −1  sources/36-web2py-spanish-translation-in-progress/06.markmin
  3. +166 −147 sources/36-web2py-spanish-translation-in-progress/14.markmin
  4. BIN  sources/36-web2py-spanish-translation-in-progress/images/en0.png
  5. BIN  sources/36-web2py-spanish-translation-in-progress/images/en1000.png
  6. BIN  sources/36-web2py-spanish-translation-in-progress/images/en1100.png
  7. BIN  sources/36-web2py-spanish-translation-in-progress/images/en1200.png
  8. BIN  sources/36-web2py-spanish-translation-in-progress/images/en1300.png
  9. BIN  sources/36-web2py-spanish-translation-in-progress/images/en1500.png
  10. BIN  sources/36-web2py-spanish-translation-in-progress/images/en1600.png
  11. BIN  sources/36-web2py-spanish-translation-in-progress/images/en1800.png
  12. BIN  sources/36-web2py-spanish-translation-in-progress/images/en1900.png
  13. BIN  sources/36-web2py-spanish-translation-in-progress/images/en200.png
  14. BIN  sources/36-web2py-spanish-translation-in-progress/images/en2000.png
  15. BIN  sources/36-web2py-spanish-translation-in-progress/images/en2100.png
  16. BIN  sources/36-web2py-spanish-translation-in-progress/images/en2200.png
  17. BIN  sources/36-web2py-spanish-translation-in-progress/images/en2300.png
  18. BIN  sources/36-web2py-spanish-translation-in-progress/images/en2400.png
  19. BIN  sources/36-web2py-spanish-translation-in-progress/images/en2500.png
  20. BIN  sources/36-web2py-spanish-translation-in-progress/images/en2700.png
  21. BIN  sources/36-web2py-spanish-translation-in-progress/images/en2800.png
  22. BIN  sources/36-web2py-spanish-translation-in-progress/images/en2900.png
  23. BIN  sources/36-web2py-spanish-translation-in-progress/images/en300.png
  24. BIN  sources/36-web2py-spanish-translation-in-progress/images/en3000.png
  25. BIN  sources/36-web2py-spanish-translation-in-progress/images/en3100.png
  26. BIN  sources/36-web2py-spanish-translation-in-progress/images/en3200.png
  27. BIN  sources/36-web2py-spanish-translation-in-progress/images/en3300.png
  28. BIN  sources/36-web2py-spanish-translation-in-progress/images/en3500.png
  29. BIN  sources/36-web2py-spanish-translation-in-progress/images/en3600.png
  30. BIN  sources/36-web2py-spanish-translation-in-progress/images/en3700.png
  31. BIN  sources/36-web2py-spanish-translation-in-progress/images/en3800.png
  32. BIN  sources/36-web2py-spanish-translation-in-progress/images/en3900.png
  33. BIN  sources/36-web2py-spanish-translation-in-progress/images/en400.png
  34. BIN  sources/36-web2py-spanish-translation-in-progress/images/en4100.png
  35. BIN  sources/36-web2py-spanish-translation-in-progress/images/en4300.png
  36. BIN  sources/36-web2py-spanish-translation-in-progress/images/en4400.png
  37. BIN  sources/36-web2py-spanish-translation-in-progress/images/en4500.png
  38. BIN  sources/36-web2py-spanish-translation-in-progress/images/en4600.png
  39. BIN  sources/36-web2py-spanish-translation-in-progress/images/en4700.png
  40. BIN  sources/36-web2py-spanish-translation-in-progress/images/en4800.png
  41. BIN  sources/36-web2py-spanish-translation-in-progress/images/en4900.png
  42. BIN  sources/36-web2py-spanish-translation-in-progress/images/en500.png
  43. BIN  sources/36-web2py-spanish-translation-in-progress/images/en5000.png
  44. BIN  sources/36-web2py-spanish-translation-in-progress/images/en5100.png
  45. BIN  sources/36-web2py-spanish-translation-in-progress/images/en5200.png
  46. BIN  sources/36-web2py-spanish-translation-in-progress/images/en5300.png
  47. BIN  sources/36-web2py-spanish-translation-in-progress/images/en5400.png
  48. BIN  sources/36-web2py-spanish-translation-in-progress/images/en5500.png
  49. BIN  sources/36-web2py-spanish-translation-in-progress/images/en5600.png
  50. BIN  sources/36-web2py-spanish-translation-in-progress/images/en5700.png
  51. BIN  sources/36-web2py-spanish-translation-in-progress/images/en5800.png
  52. BIN  sources/36-web2py-spanish-translation-in-progress/images/en5900.png
  53. BIN  sources/36-web2py-spanish-translation-in-progress/images/en600.png
  54. BIN  sources/36-web2py-spanish-translation-in-progress/images/en6000.png
  55. BIN  sources/36-web2py-spanish-translation-in-progress/images/en6100.png
  56. BIN  sources/36-web2py-spanish-translation-in-progress/images/en6200.png
  57. BIN  sources/36-web2py-spanish-translation-in-progress/images/en6300.png
  58. BIN  sources/36-web2py-spanish-translation-in-progress/images/en6400.png
  59. BIN  sources/36-web2py-spanish-translation-in-progress/images/en6500.png
  60. BIN  sources/36-web2py-spanish-translation-in-progress/images/en6600.png
  61. BIN  sources/36-web2py-spanish-translation-in-progress/images/en6700.png
  62. BIN  sources/36-web2py-spanish-translation-in-progress/images/en6800.png
  63. BIN  sources/36-web2py-spanish-translation-in-progress/images/en6900.png
  64. BIN  sources/36-web2py-spanish-translation-in-progress/images/en700.png
  65. BIN  sources/36-web2py-spanish-translation-in-progress/images/en7000.png
  66. BIN  sources/36-web2py-spanish-translation-in-progress/images/en7100.png
  67. BIN  sources/36-web2py-spanish-translation-in-progress/images/en7200.png
  68. BIN  sources/36-web2py-spanish-translation-in-progress/images/en7300.png
  69. BIN  sources/36-web2py-spanish-translation-in-progress/images/en7400.png
  70. BIN  sources/36-web2py-spanish-translation-in-progress/images/en7500.png
  71. BIN  sources/36-web2py-spanish-translation-in-progress/images/en7600.png
  72. BIN  sources/36-web2py-spanish-translation-in-progress/images/en7700.png
  73. BIN  sources/36-web2py-spanish-translation-in-progress/images/en7800.png
  74. BIN  sources/36-web2py-spanish-translation-in-progress/images/en7900.png
  75. BIN  sources/36-web2py-spanish-translation-in-progress/images/en800.png
  76. BIN  sources/36-web2py-spanish-translation-in-progress/images/en8000.png
  77. BIN  sources/36-web2py-spanish-translation-in-progress/images/en8100.png
  78. BIN  sources/36-web2py-spanish-translation-in-progress/images/en900.png
  79. BIN  sources/36-web2py-spanish-translation-in-progress/images/en9200.png
  80. +2 −2 sources/36-web2py-spanish-translation-in-progress/references/cron
  81. +1 −1  sources/36-web2py-spanish-translation-in-progress/references/editarea
  82. +1 −1  sources/36-web2py-spanish-translation-in-progress/references/feedparser
  83. +1 −1  sources/36-web2py-spanish-translation-in-progress/references/markdown2
  84. +2 −2 sources/36-web2py-spanish-translation-in-progress/references/redis
View
4 sources/36-web2py-spanish-translation-in-progress/04.markmin
@@ -2841,7 +2841,7 @@ scheduler.queue_task(informe_de_porcentajes,
web2py está desarrollado en Python, por lo que puede importar y utilizar cualquier módulo de Python, incluyendo los módulos de terceros. Sólo necesita poder hallarlos. Como con cualquier aplicación de Python, los módulos se pueden instalar en la carpeta oficial de Python "site-packages", y se pueden importar desde cualquier ubicación en tu código.
-Los módulos en la carpeta "site-packages" son, como lo sugiere el nombre, paquetes del entorno/sistema. Las aplicaciones que requieren estos paquetes no son portables a menos que esos módulos se instalen por separado. La ventaja del uso de módulos en "site-packages" es que las distintas aplicaciones los pueden compartir. Consideremos, por ejemplo, un paquete para ploteo llamado "matplotlib". Puedes instalarlo desde la consola usando el comando ``easy_install`` de PEAK``easy-install``:cite (o la alternativa más moderna ``pip`` ``PIP``:cite):
+Los módulos en la carpeta "site-packages" son, como lo sugiere el nombre, paquetes del entorno/sistema. Las aplicaciones que requieren estos paquetes no son portátiles a menos que esos módulos se instalen por separado. La ventaja del uso de módulos en "site-packages" es que las distintas aplicaciones los pueden compartir. Consideremos, por ejemplo, un paquete para ploteo llamado "matplotlib". Puedes instalarlo desde la consola usando el comando ``easy_install`` de PEAK``easy-install``:cite (o la alternativa más moderna ``pip`` ``PIP``:cite):
``
easy_install py-matplotlib
``:code
@@ -2998,7 +2998,7 @@ La directiva "handlers" especifica el tipo de historial y, para el ejemplo, la s
### WSGI
``WSGI``:inxx
-web2py y WSGI tienen una relación de amor-odio. Nuestra opinión es que WSGI fue desarrollado como protocolo para conectar servidores web a aplicaciones web en forma portable, y lo usamos con ese fin. web2py en su núcleo es una aplicación WSGI:
+web2py y WSGI tienen una relación de amor-odio. Nuestra opinión es que WSGI fue desarrollado como protocolo para conectar servidores web a aplicaciones web en forma portátil, y lo usamos con ese fin. web2py en su núcleo es una aplicación WSGI:
``gluon.main.wsgibase``. Algunos desarrolladores han llevado a WSGI a sus límites como protocolo para comunicaciones middleware y desarrollan aplicaciones web en forma de cebolla, con sus múltiples capas (cada capa es un middleware desarrollado en forma independiente de la totalidad del framework). web2py no adopta esta estructura en forma interna. Esto se debe a que creemos que las funcionalidades del núcleo de los framework (manejo de las cookie, sesión, errores, transacciones, manejo de las URL o ''dispatching'') se pueden optimizar para que sean más seguras y veloces si son manejadas por una única capa que las incluya.
De todos modos, web2py te permite el uso de aplicaciones WSGI de terceros y middleware en tres formas (y sus combinaciones):
View
2  sources/36-web2py-spanish-translation-in-progress/06.markmin
@@ -3,7 +3,7 @@
### Dependencias
-web2py viene con una Capa de Abstracción de la Base de Datos (DAL), una API que asocia objetos Python a objetos de la base de datos como consultas, tablas y registros. La DAL genera dinámicamente el SQL en tiempo real usando el dialecto específico para la base de datos utilizada, de forma que no tengas que escribir código SQL o necesites aprender distintos dialectos para los comandos SQL (usamos aquí el término SQL en general), y para que la aplicación sea portable para los distintos tipos de bases de datos. En la tabla de abajo se muestra una lista parcial de las bases de datos soportadas. Puedes consultar el sitio web de web2py y la lista de correo si necesitas otro adaptador. La base de datos NoSQL de Google es un caso particular y se trata en el Capítulo 13.
+web2py viene con una Capa de Abstracción de la Base de Datos (DAL), una API que asocia objetos Python a objetos de la base de datos como consultas, tablas y registros. La DAL genera dinámicamente el SQL en tiempo real usando el dialecto específico para la base de datos utilizada, de forma que no tengas que escribir código SQL o necesites aprender distintos dialectos para los comandos SQL (usamos aquí el término SQL en general), y para que la aplicación sea portátil para los distintos tipos de bases de datos. En la tabla de abajo se muestra una lista parcial de las bases de datos soportadas. Puedes consultar el sitio web de web2py y la lista de correo si necesitas otro adaptador. La base de datos NoSQL de Google es un caso particular y se trata en el Capítulo 13.
La distribución binaria para Windows funciona instantáneamente con SQLite y MySQL. La distribución binaria para Mac funciona sin configuración adicional con SQLite.
Para usar otro motor o ''back-end'' de base de datos, utiliza la versión de código fuente e instala el controlador o ''driver'' correspondiente a tu base de datos.
View
313 sources/36-web2py-spanish-translation-in-progress/14.markmin
@@ -3,34 +3,37 @@
### Upgrade
``upgrades``:inxx
-En la página de la interfaz administrativa "site" existe un botón "upgrade now" (actualice la versión ahora). En caso que no esté disponible o no funcione (por ejemplo por problema de bloqueo de un archivo), actualizar web2py manualmente es muy fácil.
+En la página de la interfaz administrativa "site" existe un botón "upgrade now" (actualice la versión ahora). En caso de que no esté disponible o no funcione (por ejemplo por un problema de bloqueo de un archivo), actualizar web2py manualmente es muy fácil.
-------
Simplemente descomprime la última versión de web2py sobre la vieja instalación.
-------
-Esto actualizará todas las librerías así como también las aplicaciones **admin**, **examples**, **welcome**. Además creará un nuevo archivo vacío "NEWINSTALL". Al reiniciar, web2py eliminará los archivos vacíos y empaquetará la aplicación "welcome" en "welcome.w2p". Esta última será usada como la nueva estructura de la aplicación.
-web2py no actualiza cualquier otro archivo existente en otra aplicación.
+Esto actualizará todas las librerías así como también las aplicaciones **admin**, **examples**, **welcome**. Además creará un nuevo archivo vacío "NEWINSTALL". Al reiniciar, web2py eliminará los archivos vacíos y empaquetará la aplicación "welcome" en "welcome.w2p". Esta última aplicación se usará como punto de partida para nuevas aplicaciones.
+web2py no actualiza ningún otro archivo existente en otra aplicación.
-### Cómo distribuir tus aplicaciones como binarios
+### Cómo distribuir tus aplicaciones como archivos binarios
-Es posible empaquetar tus aplicaciones con la distribución binaria de web2py y distribuirlas juntas. La licencia lo permite, siempre y cuando dejes claro en la licencia de tu aplicación que tu estas agregando web2py y añadas un enlace a ``web2py.com``.
+Es posible empaquetar tus aplicaciones con la distribución binaria de web2py y distribuirlas juntas. La licencia lo permite, siempre y cuando dejes claro en la licencia de tu aplicación que estás agregando web2py y añadas un enlace a ``web2py.com``.
-Aquí explicamos como hacer esto para Windows:
+Aquí explicamos los pasos necesarios para la distribución de Windows:
- Crea tu aplicación como usalmente lo haces.
-- Usando **admin**, compila tu aplicación(un click)
-- Usando **admin**, empaqueta la aplicación compilada(otro clic)
-- Descomprime esto en la carpeta "miapp" y comienza ahí (dos clic)
-- Carga usando **admin** el anterior paquete de la app compilada con el nombre "init" (un clic)
+- Con la app **admin**, crea una compilación en bytecode de tu aplicación (un clic)
+- También en **admin**, empaqueta la aplicación compilada, (otro clic)
+- Crea una carpeta "miapp"
+- Descarga una distribución binaria para Windows de web2py
+- Descomprime la distribución en la carpeta "miapp" y ejecútala (dos clic)
+- Usando **admin** sube la app compilada empaquetada previamente asignándole el nombre "init" (un clic)
- Crea un archivo "miapp/start.bat" que contenga "cd web2py; web2py.exe"
-- comprime la carpeta miaplicacion en un archivo "miapp.zip"
-- distribuye y/o vende "miapp.zip"
+- Crea un archivo "miapp/license" que contenga la licencia de tu app y asegúrate de que la licencia contenga la aclaración "se distribuye en conjunto con una copia sin modificaciones de web2py, obtenida en web2py.com"
+- Comprime la carpeta miapp en un archivo "miapp.zip"
+- Distribuye y/o vende "miapp.zip"
-Cuando los usuarios descompriman "miapp.zip" y hagan click "run" ellos verán tu aplicación en lugar de la aplicación "welcome".
-No tiene requerimientos del lado del usuario, ni incluso tener python pre-instalado.
+Cuando los usuarios descompriman "miapp.zip" y hagan clic en "run", verán tu aplicación en lugar de la aplicación "welcome".
+No hay requerimientos del lado del usuario, tampoco es necesario Python preinstalado.
-Para binarios en Mac el proceso es el mismo pero no hay necesidad de crear el archivo "bat".
+Para la distribución binaria en Mac el proceso es el mismo pero no hay necesidad de crear el archivo "bat".
### WingIDE, Rad2Py, y Eclipse
@@ -62,7 +65,7 @@ Esto no modifica el funcionamiento ya que nunca se ejecutará pero hace que el I
### SQLDesigner
-Hay un software llamado SQLDesigner que permite la creación de modelos de web2py en forma visual y con esa información se genera el código automáticamente. Aquí se muestra una captura de pantalla:
+Hay un software llamado SQLDesigner que permite la creación de modelos de web2py en forma visual y luego con esa información generar el código automáticamente. Aquí se muestra una captura de pantalla:
[[image @///image/designer.png center 480px]]
@@ -102,7 +105,7 @@ Los archivos y carpetas que contengan la palabra "private" en la ruta o tengan u
web2py viene con un módulo ``gluon.contrib.webclient`` que permite realizar pruebas funcionales (''functional testing'') de aplicaciones locales y remotas de web2py. En realidad, este módulo no es específico de web2py y se puede usar para realizar pruebas e interacción en forma programática con cualquier aplicación web, si bien está preparado para trabajar con sesiones y repuestas de aplicaciones de web2py.
-He aquí un ejemplo de uso. El programa a continuación crea un cliente, conecta con la acción "index" para establecer una sesión, registra un nuevo usuario, luego cierra la sesión y vuelve a autenticarse usando las nuevas credenciales:
+He aquí un ejemplo de uso. El programa que se muestra a continuación crea un cliente, conecta con la acción "index" para establecer una sesión, registra un nuevo usuario, luego cierra la sesión y vuelve a autenticarse usando las nuevas credenciales:
``
from gluon.contrib.webclient import WebClient
@@ -163,7 +166,7 @@ El estado se compone de:
- ``cliente.sessions``: un diccionario de sesiones con la forma ``{nombredeapp: id_sesión}``.
- ``cliente.forms``: un diccionario de formularios web2py detectados en el ``cliente.text``. El diccionario tiene la forma ``{_formname, _formkey}``.
-El objeto WebClient no realiza ningún análisis o conversión del contenido del ``cliente.txt`` devuelto por el servidor pero esto se puede hacer fácilmente con alguno de los módulos de terceros como BeautifulSoup. Por ejemplo, aquí se muestra un programa que demuestra cómo se pueden buscar todos los link en una página descargada por el cliente y comprobarlos:
+El objeto WebClient no realiza ningún análisis o conversión del contenido del ``cliente.txt`` devuelto por el servidor pero esto se puede hacer fácilmente con alguno de los módulos de terceros como BeautifulSoup. Por ejemplo, aquí se puede ver un programa que demuestra cómo se pueden buscar todos los link en una página descargada por el cliente y comprobarlos:
``
from BeautifulSoup import BeautifulSoup
@@ -177,26 +180,27 @@ for link in dom.findAll('a'):
### Construyendo un web2py minimalista
-A veces necesitamos implementar web2py en un servidor con muy poca memoria RAM. En este caso nosotros queremos disminuir web2py a su mínima expresión.
+A veces necesitamos desplegar web2py en un servidor con muy poca memoria RAM. En este caso necesitamos disminuir web2py a su mínima expresión.
Una sencilla manera de hacer esto es la siguiente:
-- En una máquina de producción, instala web2py desde las fuentes.
-- Desde adentro de la carpeta principal de web2py ejecuta
+- En una máquina en producción, instala la distribución de código fuente web2py.
+- Desde la carpeta principal de web2py ejecuta
``
python scripts/make_min_web2py.py /path/to/minweb2py
``
-- Ahora copia sobre "/path/to/minweb2py/applications" la aplicación que quieres implementar
-- Implementa "/path/to/minweb2py" a el pequeño servidor.
+- Ahora copia la aplicación que quieres desplegar en "/path/to/minweb2py/applications"
+- Despliega "/path/to/minweb2py" en el pequeño servidor.
El script "make_min_web2py.py" creará una distribución mínima de web2py que no incluye:
- admin
- examples
- welcome
- scripts
-- raramente usados modulos contrib
+- modulos contrib poco utilizados
+
+Esta distribución contiene una aplicación "welcome", que consiste en un único archivo para pruebas de implementación.
+Examina el script. Al principio contiene una lista detallada que indica qué está incluido y qué se omite. Puedes modificarlo fácilmente y ajustarlo a tus necesidades.
-Esto incluye una aplicación "welcome" que consiste de un archivo para permitir la implementación de pruebas.
-Mira este script. Al principio contiene una lista detallada de qué está incluido y qué es ignorado. Tu puedes fácilmente modificarlo y ajustar a tus necesidades.
### Obteniendo una URL externa
``fetch``:inxx
@@ -209,7 +213,8 @@ page = urllib.urlopen('http://www.web2py.com').read()
``API``:inxx
-Esto es usualmente correcto, pero el modulo ``urllib`` no funciona sobre "Google App Engine". Google provee una diferente API para descargar URLs que solamente funciona en GAE. en orden de hacer tu código portable, web2py incluye una función ``fetch`` que funcióna en GAE así mismo en otras instalaciones de Python
+Esto es usualmente correcto, pero el modulo ``urllib`` no funciona sobre "Google App Engine". Google provee una API diferente para descargar URLs que solamente funciona en GAE. Para hacer que tu código sea portátil, web2py incluye una función ``fetch`` que se puede usar en GAE así como también en otras instalaciones de Python
+
``
from gluon.tools import fetch
page = fetch('http://www.web2py.com')
@@ -218,7 +223,8 @@ page = fetch('http://www.web2py.com')
### Prettydate
``prettydate``:inxx
-Es usualmente útil para representar un datetime no como "2009-07-25 14:34:56" pero como "hace un año". web2py proporciona una función para esto:
+A veces es preferible representar un objeto datetime como "hace un año" en lugar de "2009-07-25 14:34:56" . web2py provee de una función para esto:
+
``
import datetime
d = datetime.datetime(2009,7,25,14,34,56)
@@ -226,36 +232,38 @@ from gluon.tools import prettydate
pretty_d = prettydate(d,T)
``:code
-El segundo argumento (T) debe ser pasado a través de la internacionalización para la salida.
+El segundo argumento (T) se debe usar si se quiere habilitar la internacionalización de la salida.
+
### Coordenadas geográficas o ''Geocoding''
``geocode``:inxx
-Si necesitas convertir una dirección (por ejemplo: "243 S Wabash Ave, Chicago, IL, USA") en coordenadas geográficas (latitud y longitud), web2py provee una función para realizar eso, entonces.
+Si necesitas convertir una dirección (por ejemplo: "243 S Wabash Ave, Chicago, IL, USA") en coordenadas geográficas (latitud y longitud), web2py provee de una función para realizar eso, entonces.
``
from gluon.tools import geocode
address = '243 S Wabash Ave, Chicago, IL, USA'
(latitude, longitude) = geocode(address)
``:code
-La función ``geocode`` require una conexión a internet además se conecta al servicio de Google de geocodificación. La función retorna ``(0,0)`` en caso de fallar. Nota que el servicio de Google de geocodificación tiene un número máximo de peticiones, entonces debes verificar sus términos y condiciones. La función ``geocode`` es implementada al comienzo de la función ``fetch`` y por esto funcióna en GAE.
+La función ``geocode`` requiere una conexión a internet y se conecta al servicio de Google de geocodificación. La función devuelve ``(0,0)`` en caso de fallar. Ten en cuenta que el servicio de Google de geocodificación tiene un número máximo de solicitudes, por lo que deberías verificar sus términos y condiciones. La función ``geocode`` está implementada utilizando la función ``fetch`` y por lo tanto funcióna también en GAE.
+
### Paginación
``pagination``:inxx
-Esta receta es un truco útil para minimizar el acceso a base de datos en el caso de la paginación, e.g., cuando necesitas mostrar una lista de filas desde una base de datos pero quieres distribuir las filas sobre múltiples páginas.
+Esta receta es un truco útil para minimizar el acceso a la base de datos cuando se requiere paginación, es decir, cuando necesitas mostrar una lista de registros de una base de datos pero quieres distribuir los registros a través de múltiples páginas.
Comienza creando una aplicación **primos** que almacene los primeros 1000 números primos en una base de datos.
Acá está el modelo ``db.py``:
``
db = DAL('sqlite://primos.db')
-db.define_table('primos',Field('valor','integer'))
+db.define_table('primo',Field('valor','integer'))
def esprimo(p):
for i in range(2,p):
if p%i==0: return False
return True
-if len(db().select(db.prime.id))==0:
+if len(db().select(db.primo.id))==0:
p=2
for i in range(1000):
while not esprimo(p): p+=1
@@ -263,25 +271,25 @@ if len(db().select(db.prime.id))==0:
p+=1
``:code
-Ahora crea una acción ``list_items`` en el controlador "default.py" que contenga lo siguiente:
+Ahora crea una acción ``listar_elementos`` en el controlador "default.py" que contenga lo siguiente:
``
def listar_elementos():
if len(request.args): pagina=int(request.args[0])
else: pagina=0
elementos_por_pagina=20
- limitby=(pagina*elementos_por_pagina,(pagina+1)*elementos_por_pagina+1)
- registros=db().select(db.primo.ALL,limitby=limitby)
+ limitby=(pagina*elementos_por_pagina, (pagina+1)*elementos_por_pagina+1)
+ registros=db().select(db.primo.ALL, limitby=limitby)
return dict(registros=registros,pagina=pagina,
elementos_por_pagina=elementos_por_pagina)
``:code
-Nota que este código selecciona uno o más item de los que necesita, 20+1. el elemento extra dice a la vista si existe la siguiente página.
+Ten en cuenta que este código selecciona uno o más item de los que necesita, 20+1. el elemento extra le indica a la vista si existe la siguiente página.
-Aquí es la vista "default/listar_elementos.html":
+Esta es la vista "default/listar_elementos.html":
``
{{extend 'layout.html'}}
-{{for i,registro in enumerate(registros):}}
+{{for i, registro in enumerate(registros):}}
{{if i==elementos_por_pagina: break}}
{{=registro.valor}}<br />
{{pass}}
@@ -295,19 +303,20 @@ Aquí es la vista "default/listar_elementos.html":
{{pass}}
``:code
-De esta manera podemos obtener la paginación con un sólo "select" por acción, y que ese "select" sólo obtenga una fila más de lo que se necesita.
+De esta manera podemos obtener la paginación con un sólo "select" por acción, y que ese "select" sólo obtenga una fila más de las que necesita.
-### httpserver.log y el Formato del archivo de bitácora.
+
+### httpserver.log y el formato del archivo de historial.
``httpserver.log``:inxx
-El servidor de web2py registra todas las peticiones en un archivo llamado:
+El servidor de web2py registra todas las solicitudes en un archivo llamado:
``
httpserver.log
``:code
-en el directorio raíz de web2py. Un nombre alternativo y ubicación puede ser especificado a través de las opciones de la línea de comandos de web2py.
+en el directorio raíz de web2py. Se pueden especificar un nombre alternativo y la ubicación a través de las opciones de la línea de comandos de web2py.
-Se añaden nuevas entradas al final del archivo cada vez que una peticón es realizada. Cada línea luce como esto:
+Se añaden nuevas entradas al final del archivo cada vez que se realiza una solicitud. Cada línea tiene una forma similar a la siguiente:
``
127.0.0.1, 2008-01-12 10:41:20, GET, /admin/default/site, HTTP/1.1, 200, 0.270000
``:code
@@ -318,45 +327,49 @@ ip, timestamp, method, path, protocol, status, time_taken
``:code
Donde
-- ip es la dirección IP del cliente que hico la petición
-- timestamp es la fecha y la hora de la petición en el formato ISO 8601, YYYY-MM-DDT HH:MM:SS
-- method bien sea GET or POST
+- ip es la dirección IP del cliente que hizo la solicitud
+- timestamp es la fecha y la hora de la solicitud en el formato ISO 8601, YYYY-MM-DDT HH:MM:SS
+- method es o bien GET o POST
- path es la ruta solicitada por el cliente
-- protocol es la versión del protocolo HTTP usado para enviar al cliente, usually HTTP/1.1
+- protocol es la versión del protocolo HTTP usado para enviar al cliente, normalmente HTTP/1.1
- status es el código de estado del protocolo HTTP ``status``:cite
-- time_taken es la cantidad de tiempo que el servidor tarda en procesar la petición, en segundos, no incluye tiempos de upload/download.
+- time_taken es la cantidad de tiempo que el servidor tarda en procesar la solicitud, en segundos, no incluye tiempos de subida/descarga.
+
+En el repositorio de aplicaciones ``appliances``:cite , se encuentra disponible para descarga una aplicación para el análisis de ''log'' (registros del sistema).
-En el repositorio de aplicaciones ``appliances``:cite , podrás encontrar una aplicación para el análisis de logs (registros del sistema).
-Estos registros de logs estan deshabilitado por defecto cuando usas mod_wsgi a partir de esto podría ser igual como el log de Apache.
+El registro en el historial se deshabilita por defecto con el uso de mod_wsgi porque duplicaría (es decir, registraría lo mismo que) el sistema de historial de Apache.
+
### Completando la base de datos con datos ficticios
-Para propósitos de pruebas es conveniente ser capaz de llenar la base de datos con información aleatoria. web2py incluye un clasificador bayesiano entrenado y listo para generar textos legibles para este propósito.
+Para efectuar pruebas y control de calidad o ''testing'', podríamos necesitar insertar registros en la base de datos con información aleatoria. web2py incluye un clasificador bayesiano que es capaz de generar textos legibles para este propósito.
-Esta es la forma más simple de usar:
+Esta es la forma más simple de usarlo:
``
from gluon.contrib.populate import populate
-populate(db.mitabla,100)
+populate(db.mitabla, 100)
``:code
-Esto insertará 100 registros aleatorios en db.mitabla, e intentará hacer inteligentemente la generación de textos cortos para campos que sean cadenas, enteros, double, date, datetime, time, booleanos, etc. para el campo correspondiente. Intentará respetar los requerimientos impuestos por los validadores. Para campos que contienen la palabra "name" , intentará generar nombres dummy. Para campos reference se generarán referencias válidas.
+Esto insertará 100 registros aleatorios en db.mitabla, e intentará generar inteligentemente textos cortos para campos que sean cadenas y enteros, double, date, datetime, time, booleanos, etc. según el tipo de campo completado. Además, intentará respetar los requerimientos impuestos por los validadores. Para campos que contengan la palabra "name" , intentará generar nombres ficticios. Para campos reference se generarán referencias válidas.
+
+Si tienes dos tablas (A y B) donde B hace referencia a A, asegúrate de rellenar primero A y luego B.
-Si tienes dos tablas (A y B) donde B hace referencia a A, comprueba llenar primero A y luego B.
+Como las inserciones son hechas en el ámbito de una única transacción, no intentes insertar demasiados registros al mismo tiempo, particularmente si estás trabajando con campos tipo reference. En cambio, haz un ciclo, insertando 100 cada vez, y luego un ``commit()``.
-Como las inserciones son hechas en una transacción, no intentes insertar muchísimos registros al mismo tiempo, particularmente si estan involucradas referencias. en su lugar, has un ciclo, insertando 100 cada vez, y luego un commit().
``
for i in range(10):
- populate(db.mitabla,100)
+ populate(db.mitabla, 100)
db.commit()
``:code
-También puedes usar el clasificador bayesiano para aprender características de algunos textos y generar textos aleatorios que sean similares, pero podría no tener sentido:
+También puedes usar el clasificador bayesiano para aprender características de algunos textos y generar textos aleatorios que sean similares, pero ten en cuenta que el resultado podría no tener sentido:
+
``
from gluon.contrib.populate import Learner, IUP
ell=Learner()
ell.learn('una entrada de texto realmente larga ...')
-print ell.generate(1000,prefix=None)
+print ell.generate(1000, prefix=None)
``:code
### Aceptando pagos con tarjetas de crédito
@@ -364,7 +377,7 @@ print ell.generate(1000,prefix=None)
``Google Wallet``:inxx ``Paypal``:inxx ``Stripe.com``:inxx
``Authorize.net``:inxx ``DowCommerce``:inxx
-Existen múltiples maneras de aceptar pagos con tarjetas de crédito por internet. web2py proporciona una API especifica para algunos de los más populares y prácticos:
+Existen múltiples maneras de aceptar pagos con tarjetas de crédito por internet. web2py provee de una API especifica para algunos de los métodos más populares y prácticos:
- Google Wallet ``googlewallet``:cite
- PayPal ``paypal``cite
@@ -373,19 +386,20 @@ Existen múltiples maneras de aceptar pagos con tarjetas de crédito por interne
- DowCommerece ``dowcommerce``:cite
-Los primeros dos mecanismos delegan el proceso de autenticación del pago en un servicio de terceros. Mientras esta es la mejor solución de seguridad (tu aplicación no tiene que manejar ninguna información de tarjetas de crédito) esto hace el proceso incómodo (el usuario debe loguearse dos veces; por ejemplo, una vez para tu aplicación, y otra con Google) y no permite que tu aplicación maneje pagos sucesivos en una forma automatizada.
+Los primeros dos mecanismos delegan el proceso de autenticación del pago en un servicio de terceros. Mientras esta es la mejor solución de seguridad (tu aplicación no tiene que manejar ninguna información de tarjetas de crédito) esto hace que el proceso sea incómodo (el usuario debe autenticarse dos veces; por ejemplo, una vez para tu aplicación, y otra con Google) y no permite que tu aplicación maneje pagos sucesivos en una forma automatizada.
+
+Hay veces que necesitas más control y quieres generar el formulario de entrada para la información de las tarjetas de crédito y que programaticalmente pregunte a quien lo procesa cómo transferir el dinero desde la tarjeta de crédito a tu cuenta.
-Hay veces que necesitas más control y quieres generar el formulario de entrada para la información de las tarjetas de crédito y que programaticalmente pregunte a quién lo procesa cómo transferir el dinero desde la tarjeta de crédito a tu cuenta.
+Por esta razón web2py provee de integración instantánea con Stripe, Authorize.net (el modulo fue desarrollado por John Conde y ligeramente modificado) y DowCommerce. Stripe es la aplicación más simple de usar y también la más económica para un bajo volumen de transacciones (no cobran un cargo fijo aunque el costo por transacción está por arriba del 3%). Authorize.net es mejor para altos volúmenes (tiene una tarifa fija anual y un costo bajo por transacción).
-Por esta razón web2py provee integración lista para usar con Stripe, Authorize.net (el modulo fue desarrollado por John Conde y ligeramente modificado) y DowCommerce. Stripe es la aplicación más simple de usar y también la más económica para bajo volumen de transacciones (No cobran un cargo fijo pero el costo por transacción está sobre el 3%). Authorize.net es mejor para altos volúmenes (tiene una tarifa fija anual más un bajo costo por transacción).
+Ten en cuenta que en el caso de Stripe y Authorize.net tu programa estará aceptando la información de las tarjetas de crédito. No es necesario que almacenes esta información y nosotros te aconsejamos no hacerlo, por los requerimientos legales que involucra (verificar con Visa o Mastercard), pero hay ocasiones en las que tú puedes querer almacenar la información para pagos sucesivos o reproducir el botón de pago en un sólo clic de Amazon.
-Ten en cuenta que en el caso de Stripe y Authorize.net tu programa estará aceptando la información de las tarjetas de crédito. No tienes que almacenar esta información y nosotros te aconsejamos no hacerlo, por los requerimientos legales que involucra (verificar con Visa o Mastercard) pero hay ocasiones en las que tu puedes querer almacenar la información para pagos sucesivos o reproducir el botón de pago de un sólo click de Amazon.
#### Google Wallet
-La manera más sencilla de usar Google Wallet (Level 1) consiste en integrar un botón a tu página y cuando hagan click, redirigir a tus visitantes a la página de pagos provista por Google.
+La manera más sencilla de usar Google Wallet (Level 1) consiste en integrar un botón a tu página y cuando hagan clic, redirigir a tus visitantes a la página de pagos provista por Google.
-Primero que todo necesitas registrar una cuenta de Google Merchant en la siguiente url:
+El primer paso es registrar una cuenta de Google Merchant en la siguiente url:
``
https://checkout.google.com/sell
@@ -398,20 +412,20 @@ Entonces simplemente necesitas crear el siguiente código en tu vista:
``
{{from gluon.contrib.google_wallet import button}}
{{=button(merchant_id="123456789012345",
- products=[dict(name="shoes",
- quantity=1,
- price=23.5,
- currency='USD',
- description="running shoes black")])}}
+ products=[dict(name="calzado",
+ quantity=1,
+ price=23.5,
+ currency='USD',
+ description="zapatillas para correr negras")])}}
``
-Cuando un visitante hace click en el botón, el visitante será redireccionado a la página de google donde ella o él pueden pagar por los artículos. Aquí productos son una lista de productos y cada producto es un diccionario de parámetros que quieres pasar describiendo tus artículos (nombre, cantidad, precio, moneda, descripción, y otros opcionales que puedes encontrar descriptos en la documentación de Google Wallet).
+Cuando un visitante hace clic en el botón, será redireccionado a la página de google donde ella o él pueden pagar por los artículos. Aquí ''products'' es una lista de productos y cada producto es un diccionario de parámetros que quieres pasar describiendo tus artículos (nombre, cantidad, precio, moneda, descripción, y otros datos opcionales que puedes encontrar descriptos en la documentación de Google Wallet).
-Si eliges usar este mecanismo, debes generar los valores pasados al botón programado con información basada en tu inventario y del carrito de compra del visitante.
+Si optas por este mecanismo, puedes necesitar generar los valores pasados al botón en forma programática según tu inventario y los datos del carrito de compras del visitante.
-Todas la información de tasas y tarifas será manejada del lado de Google. Lo mismo vale para la información de la cuenta. Por defecto tu aplicación no es informada si la transacción ha sido completada sin embargo podrías tener que visitar tu cuenta de Google Merchant para ver cuáles productos han sido vendidos y pagado por ellos, y cuáles productos necesitan ser enviados a sus compradores. también Google te enviará un email con la información.
+Todas la información de tasas y tarifas será manejada del lado de Google. Lo mismo ocurre para el caso de la información de la cuenta. Por defecto tu aplicación no recibirá un mensaje de confirmación cuando la transacción se concreta, por lo tanto, podrías tener que visitar tu cuenta de Google Merchant para ver cuáles productos han sido vendidos y pagado por los clientes, y cuáles productos necesitan ser enviados a sus compradores. Por otra parte, Google te enviará un email con la información.
-Si quieres una integración más estricta tienes que usar el nivel 2 de notificaciones de la API. En ese caso puedes pasar más información a Google y Google llamará a tu API para notificar las ventas. Esto permite mantener la información de la cuenta dentro de tu aplicación pero esto requiere que tengas servicios web que puedan comunicarse con Google Wallet.
+Si quieres una integración más estricta tienes que usar el nivel 2 de notificaciones de la API. En ese caso puedes pasar más información a Google y Google llamará a tu API para notificar las ventas. Esto permite mantener la información de la cuenta dentro de tu aplicación pero requiere que tengas servicios web capaces de comunicarse con Google Wallet.
Esto último podría llegar a resultar complicado de programar para una app determinada, pero ya disponemos de un plugin que implementa una API para este propósito.
@@ -419,11 +433,12 @@ Esto último podría llegar a resultar complicado de programar para una app dete
http://web2py.com/plugins/static/web2py.plugin.google_checkout.w2p
``
-Puedes encontrar información sobre la documentación del plugin dentro del plugin.
+Puedes encontrar información sobre la documentación del plugin dentro del programa.
+
#### Paypal
-La integración con Paypal no es descrita aquí pero puedes encontrar más información en este enlace (recurso):
+La integración con Paypal no se describe aquí, pero puedes encontrar más información en este ''slice'':
``
http://www.web2pyslices.com/main/slices/take_slice/9
@@ -431,11 +446,11 @@ http://www.web2pyslices.com/main/slices/take_slice/9
#### Stripe.com
-Esta es probablemente uno de las más fáciles y flexibles maneras de aceptar pagos con tarjetas de crédito.
+Esta es probablemente una de las formas más fáciles y flexibles para aceptar pagos con tarjetas de crédito.
-Necesitas registrar con Stripe.com y eso es un proceso muy fácil, de hecho Stripe te asignará una llave de la API para pruebas antes de que crees cualquier credencial.
+Debes registrar una cuenta en Stripe.com, que es una tarea muy simple, y Stripe te asignará una clave de la API para pruebas antes de que generes cualquier credencial.
-Una vez que tienes tu llave de la API, puedes aceptar tarjetas de crédito, con el siquiente código:
+Una vez que obtengas tu clave de la API, podrás aceptar pagos de tarjetas de crédito, con el siquiente código:
``
from gluon.contrib.stripe import Stripe
@@ -446,14 +461,14 @@ d = stripe.charge(amount=100,
card_exp_month='5',
card_exp_year='2012',
card_cvc_check='123',
- description='los zapatos negros comunes')
+ description='zapatos negros comunes')
if d.get('paid',False):
# payment accepted
elif:
# error is in d.get('error','unknown')
``
-La respuesta, ``d``, es un diccionario que puedes explorar tu mismo. El número de tarjeta usado en el ejemplo es un sandbox y siempre será exitoso. Cada transacción está asociada a un identificador almacenado en ``d['id']``.
+La respuesta, ``d``, es un diccionario que te permite explorar sus valores. El número de tarjeta usado en el ejemplo es un ''sandbox'' (espacio de pruebas) y las transacciones siempre son exitosas. Cada transacción está asociada a un identificador almacenado en ``d['id']``.
Stripe también permite verificar una transaccion en otro momento:
@@ -461,11 +476,11 @@ Stripe también permite verificar una transaccion en otro momento:
d = Stripe(key).check(d['id'])
``
-y una transacción de reembolso:
+y una transacción de reembolso:
``
r = Stripe(key).refund(d['id'])
-if r.get('refunded',False):
+if r.get('refunded', False):
# el reembolso se realizó con éxito
elif:
# error is in d.get('error','unknown')
@@ -473,28 +488,29 @@ elif:
Stripe hace sencillo mantener la contabilidad dentro de tu aplicación.
-todas las comunicaciones entre tu aplicación y Stripe se realizan sobre servicios web RESTful. Stripe actualmente expone aún más servicios y proporciona un conjunto más amplio en la API de Python. Puedes leer más sobre esto en su sitio web.
+todas las comunicaciones entre tu aplicación y Stripe se realizan sobre servicios web RESTful. Stripe en realidad expone aún más servicios y proporciona un conjunto más amplio de funcionalidades en su API para Python. Puedes leer más sobre esto en su sitio web.
+
#### Authorize.Net
-Otra simple manera de aceptar tarjetas de crédito es usar Authorize.Net. Como es usual, necesitas registrarte y obtener un ``login`` y una llave para las transacciones (``transkey``). Una vez que tengas esto, funciona muy similar en espíritu como lo hace Stripe:
+Otra manera simple de aceptar tarjetas de crédito es usando Authorize.Net. Como siempre, necesitas registrarte y obtener un ``login`` y una clave para las transacciones (``transkey``). Una vez que tengas esto, el funcionamiento es muy similar al de Stripe:
``
from gluon.contrib.AuthorizeNet import process
if process(creditcard='4427802641004797',
expiration="122012,
- total=100.0,cvv='123',tax=None,invoice=None,
- login='cnpdev4289', transkey='SR2P8g4jdEn7vFLQ',testmode=True):
+ total=100.0, cvv='123',tax=None, invoice=None,
+ login='cnpdev4289', transkey='SR2P8g4jdEn7vFLQ', testmode=True):
# el pago se ha procesado
else:
- # el pago se ha rechazado
+ # el pago ha sido rechazado
``:code
-Si tienes una cuenta válida de Authorize.Net deberías reemplazar el sandbox ``login`` y ``transkey`` con estos de tu cuenta, configurar ``testmode=False`` para ejecutar en la plataforma real en lugar del sandbox, y usar la información de la tarjeta de crédito dada por el visitante.
+Si tienes una cuenta válida de Authorize.Net deberías reemplazar los parámetros ``login`` y ``transkey`` del espacio de pruebas con los de tu cuenta, configurar ``testmode=False`` para ejecutar en la plataforma real en lugar del ''sandbox'', y usar la información de la tarjeta de crédito dada por el visitante.
-Si ``process`` devuelve ``True``, el dinero ha sido transferido desde la tarjeta de crédito del visitante a tu cuenta en Authorize.Net. ``invoice`` es sólo un string que puede ser configurado y será almacenado por Authorize.Net con esta transacción. Luego, tienes que conciliar la data con la información en tu aplicación.
+Si ``process`` devuelve ``True``, el dinero ha sido transferido desde la tarjeta de crédito del visitante a tu cuenta en Authorize.Net. ``invoice`` es sólo una cadena que se puede personalizar y será almacenada por Authorize.Net con el resto de los valores de la transacción para que puedas conciliar los datos con la información en tu aplicación.
-Aquí un ejemplo más complejo del workflow donde se exponen más variables:
+Aquí se muestra un ejemplo más complejo del flujo de trabajo donde se exponen más variables:
``
from gluon.contrib.AuthorizeNet import AIM
payment = AIM(login='cnpdev4289',
@@ -503,19 +519,19 @@ payment = AIM(login='cnpdev4289',
payment.setTransaction(creditcard, expiration, total, cvv, tax, invoice)
payment.setParameter('x_duplicate_window', 180) # duplicate_window de tres minutos
payment.setParameter('x_cust_id', '1324') # ID del cliente
-payment.setParameter('x_first_name', 'Agent')
-payment.setParameter('x_last_name', 'Smith')
-payment.setParameter('x_company', 'Test Company')
-payment.setParameter('x_address', '1234 Main Street')
-payment.setParameter('x_city', 'Townsville')
-payment.setParameter('x_state', 'NJ')
-payment.setParameter('x_zip', '12345')
-payment.setParameter('x_country', 'US')
-payment.setParameter('x_phone', '800-555-1234')
-payment.setParameter('x_description', 'Test Transaction')
-payment.setParameter('x_customer_ip', socket.gethostbyname(socket.gethostname()))
-payment.setParameter('x_email', 'you@example.com')
-payment.setParameter('x_email_customer', False)
+payment.setParameter('x_first_name', 'Agent') # nombre
+payment.setParameter('x_last_name', 'Smith') # apellido
+payment.setParameter('x_company', 'Test Company') # empresa
+payment.setParameter('x_address', '1234 Main Street') # dirección
+payment.setParameter('x_city', 'Townsville') # ciudad
+payment.setParameter('x_state', 'NJ') # estado
+payment.setParameter('x_zip', '12345') # código postal
+payment.setParameter('x_country', 'US') # país
+payment.setParameter('x_phone', '800-555-1234') # teléfono
+payment.setParameter('x_description', 'Test Transaction') # descripción
+payment.setParameter('x_customer_ip', socket.gethostbyname(socket.gethostname())) # IP del cliente
+payment.setParameter('x_email', 'tu@example.com') # correo electrónico
+payment.setParameter('x_email_customer', False) # correo del cliente
payment.process()
if payment.isApproved():
@@ -529,100 +545,102 @@ if payment.isApproved():
elif payment.isDeclined():
print 'Su tarjeta de crédito fue rechazada por el banco'
elif payment.isError():
- print 'No ha funcionado'
-print 'aprovada',payment.isApproved()
-print 'rechazada',payment.isDeclined()
-print 'error',payment.isError()
+ print 'Se produjo un error'
+print 'aprovada', payment.isApproved()
+print 'rechazada', payment.isDeclined()
+print 'error', payment.isError()
``:code
-Nota el código de arriba usa una cuenta de pruebas. Necesitas registrarte con Authorize.Net (no es un servicio gratuito) y provee tu propio login, transkey, testmode=True or False para el constructor AIM.
+Ten en cuenta que el código del ejemplo anterior usa una cuenta para pruebas. Necesitas registrarte con Authorize.Net (no es un servicio gratuito) y especificar tu propio ''login'', ''transkey'' y ''testmode'' (True or False) para el constructor de ``AIM``.
### Dropbox API
``Dropbox.com``:inxx
+Dropbox es un servicio de almacenamiento muy popular. No solo almacena tus archivos en línea sino que también mantiene el almacenamiento en la nube sincronizado con todos tus equipos. Te permite crear grupos y dar permisos de lectura o escritura para cada carpeta a usuarios individuales o grupos. También mantiene un historial de versiones de todos tus archivos. Además incluye una carpeta llamada "Public" y cada archivo que coloques allí tendrá su propia URL pública. Dropbox es una excelente herramienta de colaboración.
-Dropbox es un servicio de almacenamiento muy popular. No es sólo de almacenamiento de tus archivos porque mantiene el almacenamiento en la nube sincronizado con todas tus máquinas (PCs or dispositivos). Esto permite crear grupos y dar permisos de lectura/escritura a varias carpetas hasta usuarios individuales o grupos. También mantiene historial de versiones de todos tus archivos. E incluye una carpeta llamada "Public" y cada archivo que coloques ahí tendrá su propia URL pública. Dropbox es una excelente manera de colaborar.
-
-Puedes accedes a dropbox fácilmente registrandote en
+Puedes accedes a dropbox fácilmente registrándote en
``
https://www.dropbox.com/developers
``
-Y obtendrás una ``APP_KEY`` y un ``APP_SECRET``. Una vez que tu tengas esto puedes usar Dropbox para autenticar a tus usuarios.
+Y obtendrás una ``APP_KEY`` y un ``APP_SECRET``. Una vez que tu tengas esto podrás usar Dropbox para autenticar a tus usuarios.
Crea un archivo llamado "tuapp/private/dropbox.key" y en él escribe
``
<APP_KEY>:<APP_SECERT>:app_folder
``
-donde ``<APP_KEY>`` y ``APP_SECRET`` son tu llave (app_key) y la llave secreta (app_secret).
+donde ``<APP_KEY>`` y ``APP_SECRET`` son tu clave de aplicación (app_key) y la clave secreta (app_secret).
-Entonces en "models/db.py" coloca:
+Luego en "models/db.py" agrega el siguiente código:
``
from gluon.contrib.login_methods.dropbox_account import use_dropbox
use_janrain(auth,filename='private/dropbox.key')
-mydropbox = auth.settings.login_form
+midropbox = auth.settings.login_form
``
-Esto permite a los usuarios autenticarse en tu aplicación usando sus credenciales dropbox, y tu programa será capaz de subir archivos en sus cuentas dropbox:
+Esto permite a los usuarios autenticarse en tu aplicación usando sus credenciales de dropbox, y tu programa será capaz de subir archivos en sus cuentas dropbox:
``
stream = open('archivolocal.txt','rb')
-mydropbox.put('archivodestino.txt',stream)
+midropbox.put('archivodestino.txt', stream)
``
-descargando archivos:
+para descargar archivos:
``
-stream = mydropbox.get('archivodestino.txt')
+stream = midropbox.get('archivodestino.txt')
open('archivolocal.txt','wb').write(read)
``
-y obtener el listado del directorio:
+y para obtener el listado del directorio:
``
contenidos = mydropbox.dir(path = '/')['contents']
``
+
### Twitter API
Aquí mostramos algunos ejemplos rápidos de cómo enviar y obtener tweets. No se requieren librerías de terceros, ya que Twitter ha creado una APIs RESTful.
-Aquí tenemos un ejemplo de cómo enviar un tweet:
+Aquí se puede ver un ejemplo de cómo enviar un ''tweet'' (mensaje):
``
-def post_tweet(usuario, clave, mensaje):
+def publicar_tweet(usuario, clave, mensaje):
import urllib, urllib2, base64
import gluon.contrib.simplejson as sj
- args= urllib.urlencode([('status', ,mensaje)])
- headers={}
- headers['Authorization'] = 'Basic '+base64.b64encode(
- usuario+':'+ clave)
- req = urllib2.Request(
+ argumentos = urllib.urlencode([('status', mensaje)])
+ encabezados={}
+ encabezados['Authorization'] = 'Basic '+base64.b64encode(
+ usuario + ':' + clave)
+ solicitud = urllib2.Request(
'http://twitter.com/statuses/update.json',
- args, headers)
- return sj.loads(urllib2.urlopen(req).read())
+ argumentos, encabezados)
+ return sj.loads(urllib2.urlopen(solicitud).read())
``:code
-Aquí un ejemplo de cómo recibir tweets:
+Y este es un ejemplo para recibir mensajes de Twitter (es decir, varios tweet):
``
-def get_tweets():
- usuario='web2py'
+def recuperar_tweet():
+ """ Recupera conjunto de mensajes de Twitter """
+ usuario = 'web2py'
import urllib
import gluon.contrib.simplejson as sj
- page = urllib.urlopen('http://twitter.com/%s?format=json' % usuario).read()
- tweets=XML(sj.loads(page)['#timeline'])
- return dict(tweets=tweets)
+ pagina = urllib.urlopen('http://twitter.com/%s?format=json' % usuario).read()
+ mensajes = XML(sj.loads(pagina)['#timeline'])
+ return dict(mensajes=mensajes)
``:code
-Para operaciones más complejas, revise la documentación de la API de Twitter.
+Para operaciones más complejas, consulta la documentación de la API de Twitter.
-### Streaming de archivos virtuales
+
+### Stream de archivos virtuales
``streaming``:inxx
-Es común en programadores maliciosos el escaneado de sitios web búscando vulnerabilidades. Ellos usan escáneres de seguridad como Nessus para explorar el sitio web de interés, en búsqueda de scripts que son conocidos por tener vulnerabilidades. Un análisis de los logs del servidor web desde una máquina escaneadora o directamente en la base de datos Nessus revela que la mayoría de las vulnerabilidades conocidas están en scripts de PHP y ASP. Desde que estamos ejecutando web2py, no tenemos estas vulnerabilidades, pero somos escaneados por ellos. Esto es molesto, entonces nos gustaría responder a estos escáneres de vulnerabilidades y hacer al atacante entender que está desperdiciando su tiempo.
+Es común en programadores maliciosos el ''escaneado'' (scan) de sitios web buscando vulnerabilidades. Estos programadores usan escáneres de seguridad como Nessus para explorar el sitio web de interés, en búsqueda de script conocidos por sus vulnerabilidades. Un análisis del historial del servidor web examinado o directamente en la base de datos Nessus revela que la mayoría de las vulnerabilidades conocidas están en script de PHP y ASP. Si utilizamos web2py para nuestro servicio, no tendremos estas vulnerabilidades, pero igualmente somos escaneados por ellos. Esto es molesto, y por lo tanto, deberíamos responder a estos escáneres de vulnerabilidades y hacer al atacante entender que está desperdiciando su tiempo.
-Una posibilidad es redireccionar todas las peticiones para .php, .asp, y toda solicitud sospechosa a una acción ficticia o ''dummy'' que responderá al atacante manteniendolo ocupado por una gran cantidad de tiempo. Eventualmente el atacante se rendirá y no nos escaneará de nuevo.
+Una posibilidad es redireccionar todas las solicitudes para .php, .asp, y toda solicitud sospechosa a una acción ficticia o ''dummy'' que responderá al atacante manteniéndolo ocupado por una gran cantidad de tiempo. Eventualmente el atacante se rendirá y no nos escaneará de nuevo.
Esta receta requiere de dos partes.
@@ -630,17 +648,18 @@ Una aplicación dedicada llamada **atascador** con un controlador "default.py" c
``
class Atascador():
def read(self,n): return 'x'*n
-def atascar(): return response.stream(Atascador(),40000)
+def atascar(): return response.stream(Atascador(), 40000)
``:code
-Cuando esta acción es invocada, responderá con un infinito flujo de datos de "x"-es. 40000 caracteres al mismo tiempo.
+Cuando esta acción sea invocada, responderá con un infinito flujo de datos de "x"-es. 40000 caracteres al mismo tiempo.
-El segundo ingrediente es un archivo "route.py" que redireccione cualquier petición terminada en .php, .asp, etc. (ambos en minúsculas y mayúsculas) a su controlador.
+El segundo ingrediente es un archivo "route.py" que redireccione cualquier solicitud terminada en .php, .asp, etc. (ambos en minúsculas y mayúsculas) al controlador.
``
routes_in=(
('.*\.(php|PHP|asp|ASP|jsp|JSP)','atascador/default/atascar'),
)
``:code
-La primera vez que has sido atacado puede ocurrir una pequeña sobreutilización de recursos, pero nuestra experiencia indica que el mismo atacante no lo intentará dos veces.
+La primera vez que realicen un ataque puede ocurrir una pequeña sobreutilización de recursos, pero nuestra experiencia indica que el mismo atacante no lo intentará dos veces.
+
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en0.png 100644 → 100755
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en1000.png 100644 → 100755
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en1100.png 100644 → 100755
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en1200.png 100644 → 100755
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en1300.png 100644 → 100755
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en1500.png 100644 → 100755
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en1600.png 100644 → 100755
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en1800.png 100644 → 100755
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en1900.png 100644 → 100755
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en200.png 100644 → 100755
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en2000.png 100644 → 100755
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en2100.png 100644 → 100755
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en2200.png 100644 → 100755
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en2300.png 100644 → 100755
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en2400.png 100644 → 100755
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en2500.png 100644 → 100755
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en2700.png 100644 → 100755
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en2800.png 100644 → 100755
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en2900.png 100644 → 100755
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en300.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en3000.png 100644 → 100755
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en3100.png 100644 → 100755
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en3200.png 100644 → 100755
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en3300.png 100644 → 100755
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en3500.png 100644 → 100755
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en3600.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en3700.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en3800.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en3900.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en400.png
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en4100.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en4300.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en4400.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en4500.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en4600.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en4700.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en4800.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en4900.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en500.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en5000.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en5100.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en5200.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en5300.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en5400.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en5500.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en5600.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en5700.png
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en5800.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en5900.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en600.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en6000.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en6100.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en6200.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en6300.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en6400.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en6500.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en6600.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en6700.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en6800.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en6900.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en700.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en7000.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en7100.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en7200.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en7300.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en7400.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en7500.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en7600.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en7700.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en7800.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en7900.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en800.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en8000.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en8100.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en900.png 100644 → 100755
Diff not rendered
View
BIN  sources/36-web2py-spanish-translation-in-progress/images/en9200.png 100644 → 100755
Diff not rendered
View
4 sources/36-web2py-spanish-translation-in-progress/references/cron
@@ -5,5 +5,5 @@ publication_year: None
conference: None
key: cron
authors: []
-source_url: http://en.wikipedia.org/wiki/Cron\#crontab_syntax
-id: 4989
+source_url: http://en.wikipedia.org/wiki/Cron#CRON_expression
+id: 4989
View
2  sources/36-web2py-spanish-translation-in-progress/references/editarea
@@ -5,5 +5,5 @@ publication_year: None
conference: None
key: editarea
authors: []
-source_url: http://www.cdolivet.net/editarea/
+source_url: http://www.cdolivet.com/editarea/
id: 4967
View
2  sources/36-web2py-spanish-translation-in-progress/references/feedparser
@@ -5,5 +5,5 @@ publication_year: None
conference: None
key: feedparser
authors: []
-source_url: http://www.feedparser.org/
+source_url: http://packages.python.org/feedparser/
id: 4972
View
2  sources/36-web2py-spanish-translation-in-progress/references/markdown2
@@ -5,5 +5,5 @@ publication_year: None
conference: None
key: markdown2
authors: []
-source_url: http://code.google.com/p/python-markdown2/
+source_url: https://github.com/trentm/python-markdown2
id: 4973
View
4 sources/36-web2py-spanish-translation-in-progress/references/redis
@@ -3,7 +3,7 @@ publication_journal: None
title: None
publication_year: None
conference: None
-key: redis
+key: Redis
authors: []
source_url: http://redis.io/
-id: 5047
+id: 4950
Please sign in to comment.
Something went wrong with that request. Please try again.