Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 
 
 

137 řádky
3.8 KiB

  1. # Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
  2. # MIT License. See license.txt
  3. import sys, os
  4. import json
  5. from werkzeug.wrappers import Request, Response
  6. from werkzeug.local import LocalManager
  7. from werkzeug.exceptions import HTTPException, NotFound
  8. from werkzeug.contrib.profiler import ProfilerMiddleware
  9. from werkzeug.wsgi import SharedDataMiddleware
  10. import mimetypes
  11. import frappe
  12. import frappe.handler
  13. import frappe.auth
  14. import frappe.api
  15. import frappe.utils.response
  16. import frappe.website.render
  17. from frappe.utils import get_site_name
  18. from frappe.middlewares import StaticDataMiddleware
  19. local_manager = LocalManager([frappe.local])
  20. _site = None
  21. _sites_path = os.environ.get("SITES_PATH", ".")
  22. @Request.application
  23. def application(request):
  24. frappe.local.request = request
  25. frappe.local.is_ajax = frappe.get_request_header("X-Requested-With")=="XMLHttpRequest"
  26. response = None
  27. try:
  28. rollback = True
  29. init_site(request)
  30. if frappe.local.conf.get('maintainance_mode'):
  31. raise frappe.SessionStopped
  32. make_form_dict(request)
  33. frappe.local.http_request = frappe.auth.HTTPRequest()
  34. if frappe.local.form_dict.cmd:
  35. response = frappe.handler.handle()
  36. elif frappe.request.path.startswith("/api/"):
  37. response = frappe.api.handle()
  38. elif frappe.request.path.startswith('/backups'):
  39. response = frappe.utils.response.download_backup(request.path)
  40. elif frappe.local.request.method in ('GET', 'HEAD'):
  41. response = frappe.website.render.render(request.path)
  42. else:
  43. raise NotFound
  44. except HTTPException, e:
  45. return e
  46. except frappe.SessionStopped, e:
  47. response = frappe.utils.response.handle_session_stopped()
  48. except Exception, e:
  49. if frappe.local.is_ajax:
  50. response = frappe.utils.response.report_error(getattr(e, "http_status_code", 500))
  51. else:
  52. frappe.respond_as_web_page("Server Error",
  53. "<pre>"+frappe.get_traceback()+"</pre>",
  54. http_status_code=getattr(e, "http_status_code", 500))
  55. response = frappe.website.render.render("message")
  56. if e.__class__ == frappe.AuthenticationError:
  57. if hasattr(frappe.local, "login_manager"):
  58. frappe.local.login_manager.clear_cookies()
  59. else:
  60. if frappe.local.request.method in ("POST", "PUT") and frappe.db:
  61. frappe.db.commit()
  62. rollback = False
  63. # update session
  64. if getattr(frappe.local, "session_obj", None):
  65. updated_in_db = frappe.local.session_obj.update()
  66. if updated_in_db:
  67. frappe.db.commit()
  68. finally:
  69. if frappe.local.request.method in ("POST", "PUT") and frappe.db and rollback:
  70. frappe.db.rollback()
  71. # set cookies
  72. if response and hasattr(frappe.local, 'cookie_manager'):
  73. frappe.local.cookie_manager.flush_cookies(response=response)
  74. frappe.destroy()
  75. return response
  76. def init_site(request):
  77. site = _site or request.headers.get('X-Frappe-Site-Name') or get_site_name(request.host)
  78. frappe.init(site=site, sites_path=_sites_path)
  79. if not (frappe.local.conf and frappe.local.conf.db_name):
  80. # site does not exist
  81. raise NotFound
  82. def make_form_dict(request):
  83. frappe.local.form_dict = frappe._dict({ k:v[0] if isinstance(v, (list, tuple)) else v \
  84. for k, v in (request.form or request.args).iteritems() })
  85. application = local_manager.make_middleware(application)
  86. def serve(port=8000, profile=False, site=None, sites_path='.'):
  87. global application, _site, _sites_path
  88. _site = site
  89. _sites_path = sites_path
  90. from werkzeug.serving import run_simple
  91. if profile:
  92. application = ProfilerMiddleware(application, sort_by=('tottime', 'calls'))
  93. if not os.environ.get('NO_STATICS'):
  94. application = SharedDataMiddleware(application, {
  95. '/assets': os.path.join(sites_path, 'assets'),
  96. })
  97. application = StaticDataMiddleware(application, {
  98. '/files': os.path.abspath(sites_path)
  99. })
  100. run_simple('0.0.0.0', int(port), application, use_reloader=True,
  101. use_debugger=True, use_evalex=True, threaded=True)