Разбивая этот файл, чтобы сделать его более удобным и более читабельным


Фон этот вопрос и создать что-то вроде Craigslist или olx.com т. е. объявления реклама веб-приложение / сайт и я в принципе проблема решена и была куча неструктурированного кода, который построил другой код и сгенерированный SQL-код и другие вещи, и сейчас я сначала переписать его на Java, который есть источник, из 30 МБ до примерно ½ МБ и исправлено много старых ошибок, чтобы теперь в Python (Гэ) и файл Python для обработки Бразилии выглядит в принципе такой

from __future__ import with_statement
# coding=utf-8
import os
from google.appengine.api.users import is_current_user_admin, UserNotFoundError
import time
import cgi
import geo.geotypes
import main
from main import Ad
import captcha
import facebookconf
from google.appengine import api
from google.appengine.ext import webapp,  search
from google.appengine.ext.webapp import template
from google.appengine.runtime import DeadlineExceededError
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext import db
from google.appengine.api import users
from google.appengine.ext import blobstore
from google.appengine.ext.blobstore import BlobInfo
from google.appengine.api import images
from google.appengine.ext.db import djangoforms
from django import forms
from django.core.exceptions import ValidationError
from paginator import Paginator, InvalidPage, EmptyPage
from django.utils import translation
from datetime import datetime, timedelta
os.environ['DJANGO_SETTINGS_MODULE'] = 'conf.settings'
from django.conf import settings
from django.template import RequestContext
from util import I18NHandler, FacebookBaseHandler
import util
from google.appengine.api import urlfetch, taskqueue
from django.template.defaultfilters import register
from django.utils import simplejson as json
from functools import wraps
from google.appengine.api import urlfetch, taskqueue
from google.appengine.ext import db, webapp
from google.appengine.ext.webapp import util, template
from google.appengine.runtime import DeadlineExceededError
from random import randrange
import Cookie
import base64
import cgi
import conf
import datetime
import hashlib
import hmac
import logging
import time
import traceback
import urllib
import twitter_oauth_handler
from twitter_oauth_handler import OAuthClient
from geo.geomodel import GeoModel
from google.appengine.api import images


from django.utils.translation import gettext_lazy as _
webapp.template.register_template_library('common.templatefilters')
logo = 'market'

class Handler(FacebookBaseHandler,I18NHandler):
    def get(self, region='São Paulo', city='Grande São Paulo', category='For sale', cursor=None, limit=60, PAGESIZE = 50, twittername = None):
        lon = -46.38
        lat = -23.33

        region = region.replace("_"," ").title()
    if region is city:
        city = None        
    else: 
        city = city.replace("_"," ").title()
    category = category.replace("_"," ")
        page = int(self.request.GET.get('page', '1'))
    timeline = datetime.datetime.now () - timedelta (days = limit)
        m=int(self.request.get('r')) if self.request.get('r') else 804670
        q = self.request.get('q').encode("utf-8")
        location_map = {
      1: {'name': 'São Paulo', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      2: {'name': 'Rio De Janeiro', 'lat': -22.90, 'long': -43.21, 'radius': 294200},
      3: {'name': 'Acre', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      4: {'name': 'Alagoas', 'lat': -22.90, 'long': -43.21, 'radius': 294200},
      5: {'name': 'Amazonas', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      6: {'name': 'Amapá', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      7: {'name': 'Bahia', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      8: {'name': 'Ceará', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      9: {'name': 'Distrito Federal', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      10: {'name': 'Espírito Santo', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      11: {'name': 'Goiás', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      12: {'name': 'Mato Grosso', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      13: {'name': 'Maranhão', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      14: {'name': 'Minas Gerais', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      15: {'name': 'Pará', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      16: {'name': 'Paraíba', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      17: {'name': 'Paraná', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      18: {'name': 'Pernambuco', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      19: {'name': 'Piauí', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      20: {'name': 'Rio de Janeiro', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      21: {'name': 'Rio Grande do Norte', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      221: {'name': 'Rio Grande do Sul', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      231: {'name': 'Rondônia', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      241: {'name': 'Roraima', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      251: {'name': 'Santa Catarina', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      281: {'name': 'Sergipe', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      271: {'name': 'Tocantins', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
        }

    if region is 'Sao Paulo':
        location_map.pop('1')
        region = 'São Paulo'
    elif region is 'Rio De Janeiro':
        location_map.pop('2')
    if region is 'Acre':
        location_map.pop('3')

    location_map_br_11_cap = {
  1: {'name': 'Toda Região 11 (ddd)', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
  2: {'name': 'Todo Estado de São Paulo', 'lat': -22.90, 'long': -43.21, 'radius': 294200},
  1: {'name': 'Toda região Sudeste do Brasil', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
    }

    location_map_br_11 = {
      232: {'name': '- Zona Centro', 'lat': -22.90, 'long': -43.21, 'radius': 294200},
      133: {'name': '- Zona Norte', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      12: {'name': '- Zona Sul', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      111: {'name': '- Zona Leste', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      121: {'name': '- Zona Oeste', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      12223: {'name': 'Atibaia', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      14: {'name': 'Barueri', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      16: {'name': 'Bragança Paulista', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      17: {'name': 'Carapicuíba', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      18: {'name': 'Cotia', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      19: {'name': 'Diadema', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      10: {'name': 'Embu', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      21: {'name': 'Ferraz de Vasconcelos', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      221: {'name': 'Francisco Morato', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      231: {'name': 'Franco da Rocha', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      241: {'name': 'Guarulhos', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      251: {'name': 'Itapecerica da Serra', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      261: {'name': 'Itaquaquecetuba', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      271: {'name': 'Itu', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      281: {'name': 'Jundiaí', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      291: {'name': 'Mauá', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      311: {'name': 'Poá', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      321: {'name': 'Ribeirão Pires', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      331: {'name': 'Santana de Parnaíba', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      341: {'name': 'Santo André', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      351: {'name': 'São Bernardo do Campo', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      361: {'name': 'São Caetano do Sul', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      371: {'name': 'Suzano', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      381: {'name': 'Taboão da Serra', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
      391: {'name': 'Várzea Paulista', 'lat': -23.55, 'long': -46.64, 'radius': 294200},
    }

        #order_by = self.request.get('order')
        """
        query = Owner.all()
        query.filter("owner =", user)
        if not order_by:
            query.order("owner_tag")
        elif order_by == 'date':
            query.order("-date")
        ...
        <a href="your_page_url?order=date">order tags by most recent</a>
        """

    #query = Ad.all().search(self.request.get('q')).filter("url IN", ['www.montao.com.br','montao']).filter("modified >", timeline).filter("published =", True).order("-modified")


        ads = Ad.proximity_fetch(Ad.all().search(self.request.get('q')).filter("modified >", timeline).filter("published =", True).order("-modified") ,db.GeoPt(lat, lon),max_results=PAGESIZE+1, max_distance=m)
        ads = sorted(ads, key=lambda x: x.modified, reverse=True)
        if ads and len(ads) == PAGESIZE+1:
            next = ads[-1].modified
            ads = ads[:PAGESIZE]

        paginator = Paginator(ads,PAGESIZE)
        ads = paginator.page(page)

        location_map = sorted(location_map.iteritems(), key=lambda x: x[1]["name"])
        location_map_br_11_cap = sorted(location_map_br_11_cap.iteritems(), key=lambda x: x[1]["name"])
        location_map_br_11 = sorted(location_map_br_11.iteritems(), key=lambda x: x[1]["name"])

        all_count = Ad.all().filter("modified >", timeline).filter("published =", True).count(100000000)
        private_count = Ad.all().filter("modified >", timeline).filter("published =", True).filter("company_ad =", False).count(100000000)
        company_count = Ad.all().filter("modified >", timeline).filter("published =", True).filter("company_ad =", True).count(100000000)

        to = PAGESIZE * page
        fromand = to - PAGESIZE + 1
        if to > all_count:
            to = all_count

        self.render(u'for_sale_br', country='Brazil', region=region, category=category, city=city, location_map_br_11_cap = location_map_br_11_cap, location_map_br_11 = location_map_br_11, to=to, fromand=fromand, all_count=all_count, private_count=private_count, company_count=company_count,location_map=location_map, paginator=paginator,twittername=twittername,request=self.request,lat=self.request.get('lat'),lon=self.request.get('lon'),q=q,logo=logo,ads=ads, user_url=users.create_logout_url(self.request.uri) if users.get_current_user() else None, admin=users.is_current_user_admin(),user=users.get_current_user() if users.get_current_user() else None, )

application = webapp.WSGIApplication([('/([^/]+)/?([^/]*)/?([^/]*)',Handler),],debug=True)

def main():
    logging.getLogger().setLevel(logging.DEBUG)
    run_wsgi_app(application)

if __name__ == "__main__":
    main()


373
2
задан 26 сентября 2011 в 10:09 Источник Поделиться
Комментарии
1 ответ

Вашего импорта может использовать некоторые очистки, импорте то же самое еще несколько раз. Я также подозреваю, что вы не используете некоторые вещи, которые вы импортируете, поэтому я предлагаю некоторые усилия, чтобы это убрать.

Ваш отступ перепутались здесь, делая это тяжелее, чтобы читать. Вероятно, копия/ошибки, вставить где-то по пути.

Ваш большой словари данных должны быть глобальные переменные или загружен из отдельный файл.

если регион город:я не думаю, что это означает, что вы думаете, что это значит. Он сравнивает личность объекта не содержимое строки. Он всегда выйдет ложь в этот кусок кода. Я думаю, что ты имел в виду ==

region = region.replace("_"," ").title()

Вы делаете это основная операция в несколько раз, положите его в многоразовый и хорошо именованную функцию.

page = int(self.request.GET.get('page', '1'))

Что если веб-запрос имеет то, что не рядом там? Вы должны быть осторожны с вводом пользователя.

m=int(self.request.get('r')) if self.request.get('r') else 804670

м-это очень загадочное имя переменной, оно не дает много намеков на то, что вы делаете. Также, если самостоятельная.запрос представляет собой словарь, вам принимает второй параметр, который по умолчанию.

if region is 'Sao Paulo':
location_map.pop('1')
region = 'São Paulo'
elif region is 'Rio De Janeiro':
location_map.pop('2')
if region is 'Acre':
location_map.pop('3')

это не то, что вы хотите здесь, если это ускользнуло от вашего внимания до сих пор, вы серьезно нужно улучшить свои методы тестирования.

#order_by = self.request.get('order')
"""
query = Owner.all()
query.filter("owner =", user)
if not order_by:
query.order("owner_tag")
elif order_by == 'date':
query.order("-date")
...
<a href="your_page_url?order=date">order tags by most recent</a>
"""

#query = Ad.all().search(self.request.get('q')).filter("url IN", ['www.montao.com.br','montao']).filter("modified >", timeline).filter("published =", True).order("-modified")

Не оставляйте комментариями в коде. Это загромождает код.

    ads = Ad.proximity_fetch(Ad.all().search(self.request.get('q')).filter("modified >", timeline).filter("published =", True).order("-modified") ,db.GeoPt(lat, lon),max_results=PAGESIZE+1, max_distance=m)

Линия серьезно слишком долго. Посмотреть разбив его на несколько строк

    ads = sorted(ads, key=lambda x: x.modified, reverse=True)

если реклама имеет указанном порядке, зачем вам сортировка?

    if ads and len(ads) == PAGESIZE+1:
next = ads[-1].modified
ads = ads[:PAGESIZE]

рядом есть встроенная функция в Python. Рассмотреть вопрос об использовании другого имени

2
ответ дан 26 сентября 2011 в 03:09 Источник Поделиться