中间件

django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。

在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件,如下图。

与mange.py在同一目录下的文件夹 wupeiqi/middleware下的auth.py文件中的Authentication类

中间件中可以定义四个方法,分别是:

  • process_request(self,request)     接受request之后确定所执行的view之前
  • process_view(self, request, callback, callback_args, callback_kwargs)  执行所有view之前需要执行这句
  • process_template_response(self,request,response)       包含render方法的才用这句
  • process_exception(self, request, exception)    view抛出异常
  • process_response(self, request, response)     view 执行之后

以上方法的返回值可以是None和HttpResonse对象,如果是None,则继续按照django定义的规则向下执行,如果是HttpResonse对象,则直接将该对象返回给用户。

自定义中间件

1、创建中间件类

  1. class Testmiddle(object):
  2. def process_request(self,request):
  3. print('Testmiddle process_request')
  4. def process_view(self, request, callback, callback_args, callback_kwargs):
  5. print('Testmiddle process_view')
  6. def process_exception(self, request, exception):
  7. pass
  8. def process_response(self, request, response):
  9. print('Testmiddle process_response')
  10. return response
  11.  
  12. class Nextmiddle(object):
  13. def process_request(self,request):
  14. print('Nextmiddle process_request')
  15. def process_view(self, request, callback, callback_args, callback_kwargs):
  16. print('Nextmiddle process_view')
  17. def process_exception(self, request, exception):
  18. pass
  19. def process_response(self, request, response):
  20. print('Nextmiddle process_response')
  21. return response

2.2、注册中间件

  1. MIDDLEWARE_CLASSES = [
  2. 'django.middleware.security.SecurityMiddleware',
  3. 'django.contrib.sessions.middleware.SessionMiddleware',
  4. 'django.middleware.common.CommonMiddleware',
  5. # 'django.middleware.csrf.CsrfViewMiddleware',
  6. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  7. 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
  8. 'django.contrib.messages.middleware.MessageMiddleware',
  9. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
  10. 'middleware.middle.Testmiddle',
  11. 'middleware.middle.Nextmiddle',
  12. ]

2.3、测试使用url和views

  1. from app01 import views
  2. urlpatterns = [
  3. url(r'^admin/', admin.site.urls),
  4. url(r'^index/$', views.index),
  5.  
  6. ]
  1. def index(request):
  2. print 'This app01 Views.index'
  3. return HttpResponse('OK')

2.4、查看输出结果:

  1. '''
  2. Testmiddle process_request
  3. Nextmiddle process_request
  4. Testmiddle process_view
  5. Nextmiddle process_view
  6. This app01 Views.index
  7. Nextmiddle process_response
  8. Testmiddle process_response
  9. '''

从输出结果可以看出:

他是先执行Testmiddle 的request 方法又执行了Nextmiddle的 process_request方法。。。。

2.5、原理:

当请求进来了到达中间件

去settings里面找到MIDDLEWARE_CLASSES,MIDDLEWARE_CLASSES是一个元组

有4个列表:

  1. process_request_lsit = []
  2. process_view_list = []
  3. process_response_list = []
  4. 然后他循环MIDDLEWARE_CLASSES这个类:
  5. for in MIDDLEWARE_CLASSES
  6.   obj = 类()
  7.   if obj里有process_request方法:
  8.     process_request_lsit.append(obj.process_request)

然后循环后后执行:

  1. for i in process_request_list:
  2.   i() #加括号执行方法
  3.  
  4. for i in process_view_list:
  5. i()
  6. ............

3、中间件的流程梳理

首先看下自定义的中间件中的process_response方法他是有返回值的其他的是没有返回值的。这个return response是什么呢?

这个response就是咱们自定义的views.index返回的结果!

  1. def process_response(self, request, response):
  2. print( 'Testmiddle process_response')
  3. return response

如果在其他的没有返回值得,仅有process_response有返回值得话他的请求流程是这样的:

但是如果在process_request或者process_view又返回值得话那么流程就完全不一样了!

举例:如果有m1和m2两个中间件,如果我在m1中的request方法中设置了,如果访问为1.1.1.1那么返回要一个404,那么他的访问流程是这样的:

process_exception  什么时候触发呢?咱们定义的views.index出错的时候他就会捕捉到然后执行咱们定义的process_exception方法如下图:

缓存

由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到,并返回。

举个例子来说:如果访问量比较大的时候,有很多相同的操作比如:有时候请求的数据比如访问同一条数据,或者同一个页面的时候,其实是没必要的。

Django支持,mysql,Redis、Memecache、文件的方式做缓存,并且可以设置超时时间。

Django中提供了6种缓存方式:

  • 开发调试
  • 内存
  • 文件
  • 数据库
  • Memcache缓存(python-memcached模块)
  • Memcache缓存(pylibmc模块)

1、配置

a、开发调试

  1. # 此为开始调试用,实际内部不做任何操作
  2. # 配置:
  3. CACHES = {
  4. 'default': {
  5. 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', # 引擎
  6. 'TIMEOUT': 300, # 缓存超时时间(默认300,None表示永不过期,0表示立即过期)
  7. 'OPTIONS':{
  8. 'MAX_ENTRIES': 300, # 最大缓存个数(默认300)
  9. 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
  10. },
  11. 'KEY_PREFIX': '', # 缓存key的前缀(默认空)
  12. 'VERSION': 1, # 缓存key的版本(默认1)
  13. 'KEY_FUNCTION' 函数名 # 生成key的函数(默认函数会生成为:【前缀:版本:key】)
  14. }
  15. }
  16.  
  17. # 自定义key
  18. def default_key_func(key, key_prefix, version):
  19. """
  20. Default function to generate keys.
  21.  
  22. Constructs the key used by all other methods. By default it prepends
  23. the `key_prefix'. KEY_FUNCTION can be used to specify an alternate
  24. function with custom key making behavior.
  25. """
  26. return '%s:%s:%s' % (key_prefix, version, key)
  27.  
  28. def get_key_func(key_func):
  29. """
  30. Function to decide which key function to use.
  31.  
  32. Defaults to ``default_key_func``.
  33. """
  34. if key_func is not None:
  35. if callable(key_func):
  36. return key_func
  37. else:
  38. return import_string(key_func)
  39. return default_key_func

b、内存

  1. # 此缓存将内容保存至内存的变量中
  2. # 配置:
  3. CACHES = {
  4. 'default': {
  5. 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
  6. 'LOCATION': 'unique-snowflake',
  7. }
  8. }
  9.  
  10. # 注:其他配置同开发调试版本

c、文件

  1. # 此缓存将内容保存至文件
  2. # 配置:
  3.  
  4. CACHES = {
  5. 'default': {
  6. 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
  7. 'LOCATION': '/var/tmp/django_cache',
  8. }
  9. }
  10. # 注:其他配置同开发调试版本

d、数据库

  1. # 此缓存将内容保存至数据库
  2.  
  3. # 配置:
  4. CACHES = {
  5. 'default': {
  6. 'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
  7. 'LOCATION': 'my_cache_table', # 数据库表
  8. }
  9. }
  10.  
  11. # 注:执行创建表命令 python manage.py createcachetable

  

e、Memcache缓存(python-memcached模块)

  1. # 此缓存使用python-memcached模块连接memcache
  2.  
  3. CACHES = {
  4. 'default': {
  5. 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
  6. 'LOCATION': '127.0.0.1:11211',
  7. }
  8. }
  9.  
  10. CACHES = {
  11. 'default': {
  12. 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
  13. 'LOCATION': 'unix:/tmp/memcached.sock',
  14. }
  15. }
  16.  
  17. CACHES = {
  18. 'default': {
  19. 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
  20. 'LOCATION': [
  21. '172.19.26.240:11211',
  22. '172.19.26.242:11211',
  23. ]
  24. }
  25. }

f、Memcache缓存(pylibmc模块)

  1. # 此缓存使用pylibmc模块连接memcache
  2.  
  3. CACHES = {
  4. 'default': {
  5. 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
  6. 'LOCATION': '127.0.0.1:11211',
  7. }
  8. }
  9.  
  10. CACHES = {
  11. 'default': {
  12. 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
  13. 'LOCATION': '/tmp/memcached.sock',
  14. }
  15. }
  16.  
  17. CACHES = {
  18. 'default': {
  19. 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
  20. 'LOCATION': [
  21. '172.19.26.240:11211',
  22. '172.19.26.242:11211',
  23. ]
  24. }
  25. }

2、应用

a. 全站使用

  1. 使用中间件,经过一系列的认证等操作,如果内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户,当返回给用户之前,判断缓存中是否已经存在,如果不存在则UpdateCacheMiddleware会将缓存保存至缓存,从而实现全站缓存
  2.  
  3. MIDDLEWARE = [
  4. 'django.middleware.cache.UpdateCacheMiddleware',
  5. # 其他中间件...
  6. 'django.middleware.cache.FetchFromCacheMiddleware',
  7. ]
  8.  
  9. CACHE_MIDDLEWARE_ALIAS = ""
  10. CACHE_MIDDLEWARE_SECONDS = ""
  11. CACHE_MIDDLEWARE_KEY_PREFIX = ""

b. 单独视图缓存

  1. 方式一:
  2. from django.views.decorators.cache import cache_page
  3.  
  4. # #这里设置的是 60秒 * 15 ,15分钟之后
  5. @cache_page(60 * 15)
  6. def my_view(request):
  7. ...
  8.  
  9. 方式二:
  10. from django.views.decorators.cache import cache_page
  11.  
  12. urlpatterns = [
  13. url(r'^foo/([0-9]{1,2})/$', cache_page(60 * 15)(my_view)),
  14. ]

  

c、局部视图使用

  1. a. 引入TemplateTag
  2.  
  3. {% load cache %}
  4.  
  5. b. 使用缓存
  6.  
  7. {% cache 5000 缓存key %}
  8. 缓存内容
  9. {% endcache %}

  

信号

Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。

1.Django内置信号

  1. Model signals
  2. pre_init # django的modal执行其构造方法前,自动触发
  3. post_init # django的modal执行其构造方法后,自动触发
  4. pre_save # django的modal对象保存前,自动触发
  5. post_save # django的modal对象保存后,自动触发
  6. pre_delete # django的modal对象删除前,自动触发
  7. post_delete # django的modal对象删除后,自动触发
  8. m2m_changed # django的modal中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发
  9. class_prepared # 程序启动时,检测已注册的app中modal类,对于每一个类,自动触发
  10. Management signals
  11. pre_migrate # 执行migrate命令前,自动触发
  12. post_migrate # 执行migrate命令后,自动触发
  13. Request/response signals
  14. request_started # 请求到来前,自动触发
  15. request_finished # 请求结束后,自动触发
  16. got_request_exception # 请求异常后,自动触发
  17. Test signals
  18. setting_changed # 使用test测试修改配置文件时,自动触发
  19. template_rendered # 使用test测试渲染模板时,自动触发
  20. Database Wrappers
  21. connection_created # 创建数据库连接时,自动触发

对于Django内置信号,仅需注册指定信号,当程序执行响应操作时,自动触发注册函数:

  1. from django.core.signals import request_finished
  2. from django.core.signals import request_started
  3. from django.core.signals import got_request_exception
  4.  
  5. from django.db.models.signals import class_prepared
  6. from django.db.models.signals import pre_init, post_init
  7. from django.db.models.signals import pre_save, post_save
  8. from django.db.models.signals import pre_delete, post_delete
  9. from django.db.models.signals import m2m_changed
  10. from django.db.models.signals import pre_migrate, post_migrate
  11.  
  12. from django.test.signals import setting_changed
  13. from django.test.signals import template_rendered
  14.  
  15. from django.db.backends.signals import connection_created
  16.  
  17. def callback(sender, **kwargs):
  18. print("xxoo_callback")
  19. print(sender,kwargs)
  20.  
  21. xxoo.connect(callback)
  22. # xxxoo指上述导入的模块函数的内容

装饰器信号(局部信号注册)

  1. from django.core.signals import request_finished
  2. ##传入信号参数
  3. from django.dispatch import receiver
  4.  
  5. receiver #调用这个方法,传入信号参数
  6. @receiver(request_finished)
  7. def my_callback(sender, **kwargs):
  8. print("Request finished!")

2、自定义信号

a.定义信号(一般放在__init__文件中)

  1. import django.dispatch
  2. pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])
  3.  
  4. #providing_args=["toppings", "size"] 这是传入参数可以随便改,触发时对应上就可以

b. 注册信号

  1. def callback(sender, **kwargs):
  2. print("callback")
  3. print(sender,kwargs)
  4.  
  5. ###callback 这个函数名是固定的不可以改
  6.  
  7. pizza_done.connect(callback)

c. 触发信号

  1. from 路径 import pizza_done
  2.  
  3. pizza_done.send(sender='seven',toppings=123, size=456)
  4.  
  5. ##sender 调用者

由于内置信号的触发者已经集成到Django中,所以其会自动调用,而对于自定义信号则需要开发者在任意位置触发。

小案例

  1. settings.py ##装在mysql
  2.  
  3. DATABASES = {
  4. 'default': {
  5. 'ENGINE': 'django.db.backends.mysql',
  6. 'NAME':'day824',
  7. 'USER': 'root',
  8. 'PASSWORD': '*****',
  9. 'HOST': '',
  10. 'PORT': '',
  11. }
  12. }
  13.  
  14. models.py
  15.  
  16. from django.db import models
  17.  
  18. class UserInfo(models.Model): ##创建表
  19. name =models.CharField(max_length=64) #
  20.  
  21. # python manage.py makemigrations
  22. # python manage.py migrate
  23.  
  24. __init__里面导入
  25.  
  26. import pymysql
  27. pymysql.install_as_MySQLdb()
  28.  
  29. django.py 下面的__init__方法 ,每次初始化progect时执行信号的注册,
  30.  
  31. from django.db.models.signals import pre_save, post_save #导入信号
  32. 每次执行modal操作前pre_save 执行后 post_save
  33.  
  34. ##sender 调用者
  35. def callback(sender,**kwargs): ##modal对象保存前执行这个函数,
  36. print('pre_save_callback')
  37. print(sender,kwargs)
  38.  
  39. def callback1(sender, **kwargs): ##modal对象保存后执行这个函数,
  40. print('poost_save_callback')
  41. print(sender,kwargs)
  42.  
  43. pre_save.connect(callback) #调用函数
  44. post_save.connect(callback) #调用函数
  45.  
  46. views.py
  47.  
  48. def cache3(request):
  49. t = time.time()
  50. print('befo')
  51. UserInfo.objects.create(name='alex')
  52. print('afte')
  53. return render(request,'cache3.html',{'t':t})
  54.  
  55. 执行结果:
  56.  
  57. befo
  58. pre_save_callback ##调用执行前的结果
  59. <class 'app1.models.UserInfo'> {'instance': <UserInfo: UserInfo object>, 'raw': False, 'using': 'default', 'update_fields': None, 'signal': <django.db.models.signals.ModelSignal object at 0x02B3C3B0>}
  60. pre_save_callback##调用执行前的结果
  61. <class 'app1.models.UserInfo'> {'instance': <UserInfo: UserInfo object>, 'raw': False, 'update_fields': None, 'signal': <django.db.models.signals.ModelSignal object at 0x02B3C410>, 'using': 'default', 'created': True}
  62. afte

  

缓存文件小案例

  1. urls.py ##配置路由
  2.  
  3. from app1 import views
  4. urlpatterns = [
  5. url(r'^cache3/',views.cache3),
  6. ]
  7.  
  8. 先得配置 settings.py
  9.  
  10. CACHES ={
  11. 'default':{
  12. 'BACKEND':'django.core.cache.backends.filebased.FileBasedCache',
  13. 'LOCATION':os.path.join(BASE_DIR,'file') ##缓存存放的位置
  14. }
  15. }
  16.  
  17. views.py
  18.  
  19. def cache3(request):
  20. t = time.time() #时间戳
  21. return render(request,'cache3.html',{'t':t})
  22.  
  23. cache3.html
  24.  
  25. {% load cache %}
  26. {# 导入 cache #}
  27. <!DOCTYPE html>
  28. <html lang="en">
  29. <head>
  30. <meta charset="UTF-8">
  31. <title>Title</title>
  32. </head>
  33. <body>
  34. {{ t }}
  35. {#普通时间戳 #}
  36. <hr />
  37. {% cache 10 nnn %}
  38. {# 缓存的数据 #}
  39. {{ t }}
  40. {% endcache %}
  41. </body>
  42. </html>

跨站请求伪造

一、简介

django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。在表单应用中,必须加上证书才可以访问,{% csrf_token %}

全局:

  中间件 django.middleware.csrf.CsrfViewMiddleware

局部:

注:这里得导入模块

  from django.views.decorators.csrf import csrf_exempt,csrf_protect

  • @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件,传入任何POST请求都可以通过。
  • @csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件,任何POST请求都不通过。

二、应用

1、普通表单

  1. veiw中设置返回值:
  2.   return render_to_response('Account/Login.html',data,context_instance=RequestContext(request))  
  3. 或者
  4. return render(request, 'xxx.html', data)
  5.  
  6. html中设置Token:
  7.   {% csrf_token %} //设置证书

2、Ajax

对于传统的form,可以通过表单的方式将token再次发送到服务端,而对于ajax的话,使用如下方式。

view.py

  1. from django.template.context import RequestContext
  2. #通常我们用的都是render ,render可以生成token字符串,
  3. #render_to_response 无法生成token字符串,导入RequestContext 就可以生成token字符串
  4. # Create your views here.
  5.  
  6. def test(request):
  7.  
  8. if request.method == 'POST':
  9. print request.POST
  10. return HttpResponse('ok')
  11. return render_to_response('app01/test.html',context_instance=RequestContext(request))

text.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. {% csrf_token %}
  9.  
  10. <input type="button" onclick="Do();" value="Do it"/>
  11.  
  12. <script src="/static/plugin/jquery/jquery-1.8.0.js"></script>
  13. <script src="/static/plugin/jquery/jquery.cookie.js"></script>
  14. <script type="text/javascript">
  15. var csrftoken = $.cookie('csrftoken');
  16.  
  17. function csrfSafeMethod(method) {
  18. // these HTTP methods do not require CSRF protection
  19. return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
  20. }
  21. $.ajaxSetup({
  22. beforeSend: function(xhr, settings) {
  23. if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
  24. xhr.setRequestHeader("X-CSRFToken", csrftoken);
  25. }
  26. }
  27. });
  28. function Do(){
  29.  
  30. $.ajax({
  31. url:"/app01/test/",
  32. data:{id:1},
  33. type:'POST',
  34. success:function(data){
  35. console.log(data);
  36. }
  37. });
  38.  
  39. }
  40. </script>
  41. </body>
  42. </html>

更多

django 缓存、中间件、信号、CSRF 详解的更多相关文章

  1. Django 2.0 学习(18):Django 缓存、信号和extra

    Django 缓存.信号和extra Django 缓存 由于Django是动态网站,所以每次请求均会去数据库进行相应的操作,当程序访问量大时,耗时必然会显著增加.最简单的解决方法是:使用缓存,缓存将 ...

  2. 分布式缓存Memcached/memcached/memcache详解及区别

    先来解释下标题中的三种写法:首字母大写的Memcached,指的是Memcached服务器,就是独立运行Memcached的后台服务器,用于存储缓存数据的“容器”.memcached和memcache ...

  3. PHP输出缓存ob系列函数详解

    PHP输出缓存ob系列函数详解 ob,输出缓冲区,是output buffering的简称,而不是output cache.ob用对了,是能对速度有一定的帮助,但是盲目的加上ob函数,只会增加CPU额 ...

  4. QT信号槽详解

    1         QT信号槽详解 1.1  信号和槽的定义 信号是触发信号,例如按钮的点击触发一个clicked信号,槽是用来接收信号,并处理信号,相当于信号响应函数.一个信号可以关联多个槽函数,信 ...

  5. XSS与CSRF详解

    XSS与CSRF详解 随着Web2.0.社交网络.微博等等一系列新型的互联网产品的诞生,基于Web环境的互联网应用越来越广泛,企业信息化的过程中各种应用都架设在Web平台上,Web业务的迅速发展也引起 ...

  6. laravel框架的中间件middleware的详解

    本篇文章给大家带来的内容是关于laravel框架的中间件middleware的详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. laravel中间件是个非常方便的东西,能将一些逻辑 ...

  7. 【Django】中间件,csrf,缓存,信号

    中间件(middleware) 描述:Middlewares 是修改 Django request 或者 response 对象的钩子. 在django中,中间件其实就是一个类,在请求到来和结束后,d ...

  8. Django之中间件&信号&缓存&form上传

    中间件 1.中间件是什么? 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用, ...

  9. django缓存、信号、序列化

    本篇导航: Django的缓存机制 Django的信号 Django的序列化 一.Django的缓存机制 1.缓存介绍 1)缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增, ...

随机推荐

  1. 周末惊魂:因struts2 016 017 019漏洞被入侵,修复。

    入侵(暴风雨前的宁静) 下午阳光甚好,想趁着安静的周末静下心来写写代码.刚过一个小时,3点左右,客服MM找我,告知客户都在说平台登录不了(我们有专门的客户qq群).看了下数据库连接数,正常.登录阿里云 ...

  2. 每次新建项目出现appcompat_v7 解决方法

    ADT升级版本后每次新建项目出现appcompat_v7 , 解决方案如下 问题生成:

  3. CentOS 防火墙开放特定端口

    iptables是linux下的防火墙,同时也是服务名称.   service  iptables  status        查看防火墙状态 service  iptables  start   ...

  4. 《连载 | 物联网框架ServerSuperIO教程》- 9. 协议过滤器,解决一包多发、粘包、冗余数据

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  5. 使用MyBatis Generator自动创建代码(dao,mapping,poji)

    连接的数据库为SQL server2008,所以需要的文件为sqljdbc4.jar 使用的lib库有: 在lib库目录下新建一个src文件夹用来存放生成的文件,然后新建generatorConfig ...

  6. javascript的理解及经典案例

    js的简介: JavaScript是一种能让你的网页更加生动活泼的程式语言,也是目前网页中设计中最容易学又最方便的语言. 你可以利用JavaScript轻易的做出亲切的欢迎讯息.漂亮的数字钟.有广告效 ...

  7. AlloyRenderingEngine文本框组件

    写在前面 Github: https://github.com/AlloyTeam/AlloyGameEngine 在dom元素里,自带了input标签,设置其type为text,它就是一个文本框. ...

  8. [JS,Canvas]日历时钟

    [JS,Canvas]日历时钟 Html: <!doctype html> <html> <head> <meta charset="UTF-8&q ...

  9. CentOS7安装NodeJS6.9

    1.下载 wget https://nodejs.org/dist/v6.9.2/node-v6.9.2-linux-x64.tar.xz 2.解压 tar -xJf node-v6.9.2-linu ...

  10. ArcGIS 地图性能优化系列一

    经常有客户会咨询到如何提高地图的显示性能.为何ArcMap刷新地图那么缓慢.为何地图服务响应要等待10多秒? 诸如这些问题,虽然它们的表象都是相似的,但是往往在分析排查问题的时候,我们发现背后的原因是 ...