跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets,CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
原因:我们在自定义分页时候会额外的给页面添加html代码,默认Django会认为这些代码是不安全的属于XSS攻击,所以会当作字符串处理不会作为html代码显示,所以我们需要告诉Django这个代码是安全的。
4.使用示例
.utils request.method=== int(request.GET.get(,1))
mypage = page.PagiNation(current_index=current_index,data_num=500=mypage.page_str( render(request,:page_str})
<table style="height: 30px; background-color: #afeeee; width: 1266px; ; width: 1266px;" border="0">
<tr>
<td><span style="font-size: 16px;">四、跨站请求伪造(CSRF)</td>
</tr></table>
1、简介:
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比更具危险性。
2、Django中防护CSRF模块
Django中的CSRF防护是通过中间件的手段来达到防护的目的,中间件路径:django.middleware.csrf.CsrfViewMiddleware ,配置文件settings中指定了全局配置,单也可以单独针对某个views函数来配置,具体配置:
中间件 django.middleware.csrf.CsrfViewMiddleware
@csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
@csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
TIPS:配置模块导入from django.views.decorators.csrf import csrf_exempt,csrf_protect
3、原理
当我们向Django后台post数据时,在Django中防护CSRF是通过获取用户请求头中是否含有X-CSRFtoken请求头所对应的随机字符串(),如果有并且是正确的,则可以提交,否则则返回Forbidden(403)错误。
4、提交数据
form表单提交数据:在form表单中加上{% csrf_token %},默认会在表单中生成隐藏的input标签
提交过程:
用户访问页面,{% csrf_token %}模版语言生成CSRF随机随机字符串,并且cookie中也生成了该字符串,当用户提交数据时候cookie中会带着这个字符串进行提交,如果没有该字符串则提交失败
通过ajax提交数据时候,和form表单一样,我们提交数据时需要在请求头中加上X-CSRFtoken,所以提交的时候需要利用js获取cookie中的该随机字符串进行提交:
$("#btn").click("/login/""POST""user":"wd","pwd":"1234""X-CSRFtoken":$.cookie("csrftoken")},
success: }
})
})</span></pre>
但是如果页面中有多个ajax请求的话就在每个ajax中添加headers信息,所以可以在页面框架加载完时候通过以下方式提交,这样会在页面中所有ajax提交数据之前加上csrftoken信息
xhr.setRequestHeader("X-CSRFtoken",$.cookie("csrftoken"
最后,一般我们只希望post提交数据时候才会使用csrf验证,所以官网推荐
(/^(GET|HEAD|OPTIONS|TRACE)$/
}
$.ajaxSetup({
beforeSend: (!csrfSafeMethod(settings.type) && !"X-CSRFToken"
5、Django后台验证过程
csrf在前端的key为X-CSRFtoken,通过form或者ajax提交到后台,后端的django会自动添加HTTP_,并且最后为的key变成HTTP_X_CSRFtoken,如果随机字符串通过验证则数据提交,否则报错(403)。
1、简介
django中的中间件,在其他web框架中,有的叫管道或者httphandle,Django中很多功能都是通过中间件实现的,实际上中间件就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。在工程中的settings.py中由变量MIDDLEWARE控制,请求从上到下依次穿过中间件,每个中间件中都可以有5个方法:
- process_request(self,request)#请求最开始执行的方法
- process_response(self,response)#请求返回时候执行的方法
- process_view(self,callback,callback_args,callback_kwargs)#请求到达views视图之前执行的方法
- process_exception(self,exception) # 默认不执行,除非Views方法出错
- process_template_response(self,response) # 默认不执行,除非Views中的函数返回的对象中,具有render方法(区别于模板渲染的render)
2、请求在中间件中的方法请求过程
- 用户请求先中间件,由上到下先后执行每个中间件process_request方法;
- 执行完每个中间件的process_request方法之后,请求到达urls路由关系映射;
- 到达urls路由映射以后,由下至上执行每个中间件的process_views方法;
- 执行完process_views,请求到达views函数,此时若views函数有错误信息,则由下到上执行process_exception方法,直到错误被抓住停止,都没有抓住页面包错;
- 如果views函数中没有出错,那么请求由下到上执行每个中间件的process_response方法,最后响应客户;
大致的请求过程:
3、自定义中间件
自定义中间件,我们至少包括两个方法,一个是process_request,还有一个是process_response,创建一个py文件,在工程中创建MyMiddleWare目录(与tempates同级),创建文件md.py,注意使用process_response必须返回response:
django.utils.deprecation django.shortcuts <span style="color: #008000;">#<span style="color: #008000;">中间件1
<span style="color: #0000ff;">class<span style="color: #000000;"> Row1(MiddlewareMixin):
<span style="color: #0000ff;">def<span style="color: #000000;"> process_request(self,request):
<span style="color: #0000ff;">print(<span style="color: #800000;">"<span style="color: #800000;">中间件1请求<span style="color: #800000;">"<span style="color: #000000;">)
<span style="color: #0000ff;">def<span style="color: #000000;"> process_response(self,response):
<span style="color: #0000ff;">print(<span style="color: #800000;">"<span style="color: #800000;">中间件1返回<span style="color: #800000;">"<span style="color: #000000;">)
<span style="color: #0000ff;">return<span style="color: #000000;"> response
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> process_view(self,callback_kwargs):
</span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">"</span><span style="color: #800000;">中间件1view</span><span style="color: #800000;">"</span><span style="color: #000000;">)
<span style="color: #008000;">#<span style="color: #008000;">中间件2
<span style="color: #0000ff;">class<span style="color: #000000;"> Row2(MiddlewareMixin):
<span style="color: #0000ff;">def<span style="color: #000000;"> process_request(self,request):
<span style="color: #0000ff;">print(<span style="color: #800000;">"<span style="color: #800000;">中间件2请求<span style="color: #800000;">"<span style="color: #000000;">)
<span style="color: #008000;">#<span style="color: #008000;"> return HttpResponse("走")
<span style="color: #0000ff;">def<span style="color: #000000;"> process_response(self,response):
<span style="color: #0000ff;">print(<span style="color: #800000;">"<span style="color: #800000;">中间件2返回<span style="color: #800000;">"<span style="color: #000000;">)
<span style="color: #0000ff;">return<span style="color: #000000;"> response
<span style="color: #0000ff;">def<span style="color: #000000;"> process_view(self,callback_kwargs):
<span style="color: #0000ff;">print(<span style="color: #800000;">"<span style="color: #800000;">中间件2view<span style="color: #800000;">"<span style="color: #000000;">)
<span style="color: #008000;">#<span style="color: #008000;">中间件3
<span style="color: #0000ff;">class<span style="color: #000000;"> Row3(MiddlewareMixin):
<span style="color: #0000ff;">def<span style="color: #000000;"> process_request(self,request):
<span style="color: #0000ff;">print(<span style="color: #800000;">"<span style="color: #800000;">中间件3请求<span style="color: #800000;">"<span style="color: #000000;">)
<span style="color: #0000ff;">def<span style="color: #000000;"> process_response(self,response):
<span style="color: #0000ff;">print(<span style="color: #800000;">"<span style="color: #800000;">中间件3返回<span style="color: #800000;">"<span style="color: #000000;">)
<span style="color: #0000ff;">return<span style="color: #000000;"> response
<span style="color: #0000ff;">def<span style="color: #000000;"> process_view(self,callback_kwargs):
<span style="color: #0000ff;">print(<span style="color: #800000;">"<span style="color: #800000;">中间件3view<span style="color: #800000;">"<span style="color: #000000;">)
<span style="color: #0000ff;">def<span style="color: #000000;"> process_exception(self,exception):
<span style="color: #800000;">"""<span style="color: #800000;">只有出现异常时才会执行<span style="color: #800000;">"""
<span style="color: #0000ff;">if<span style="color: #000000;"> isinstance(exception,ValueError):
<span style="color: #0000ff;">return HttpResponse(<span style="color: #800000;">'<span style="color: #800000;">出现异常》。。<span style="color: #800000;">'<span style="color: #000000;">)
<span style="color: #0000ff;">elif<span style="color: #000000;"> isinstance(exception,TemplateDoesNotExist):
<span style="color: #0000ff;">print<span style="color: #000000;">(request.path_info)
<span style="color: #0000ff;">return render(request,<span style="color: #800000;">"<span style="color: #800000;">404.html<span style="color: #800000;">"<span style="color: #000000;">)
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> process_template_response(self,response):
</span><span style="color: #800000;">"""</span><span style="color: #800000;">如果Views中的函数返回的对象中,具有render方法才会执行</span><span style="color: #800000;">"""</span>
<span style="color: #0000ff;">print</span>(<span style="color: #800000;">'</span><span style="color: #800000;">-----------------------</span><span style="color: #800000;">'</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">return</span> response</pre>
注册中间件:使用中间件需要在settings.py中注册你的中间件,配置就是你的中间件文件路径
MIDDLEWARE =
4、版本变化
上面所说的Django中间件请求过程是在1.10版本之后(包括1.10),而在1.10版本之前稍微有些区别,区别就在请求异常时候,
简介
由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者memchazhe中之前缓存的内容拿到,并返回。
Django提供了6种缓存方式:
- 开发调试
- 内存
- 文件
- 数据库
- Memcache缓存(python-memcached模块)
- Memcache缓存(pylibmc模块)
缓存方式配置
通用配置
CACHES =: ,
: 300,
: 300,
: 3,
: ,
: 1,
函数名
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 自定义key</span>
<span style="color: #0000ff;">def</span><span style="color: #000000;"> default_key_func(key,key_prefix,version):
</span><span style="color: #800000;">"""</span><span style="color: #800000;">
Default function to generate keys.
Constructs the key used by all other methods. By default it prepends
the `key_prefix'. KEY_FUNCTION can be used to specify an alternate
function with custom key making behavior.
</span><span style="color: #800000;">"""</span>
<span style="color: #0000ff;">return</span> <span style="color: #800000;">'</span><span style="color: #800000;">%s:%s:%s</span><span style="color: #800000;">'</span> %<span style="color: #000000;"> (key_prefix,version,key)
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> get_key_func(key_func):
</span><span style="color: #800000;">"""</span><span style="color: #800000;">
Function to decide which key function to use.
Defaults to ``default_key_func``.
</span><span style="color: #800000;">"""</span>
<span style="color: #0000ff;">if</span> key_func <span style="color: #0000ff;">is</span> <span style="color: #0000ff;">not</span><span style="color: #000000;"> None:
</span><span style="color: #0000ff;">if</span><span style="color: #000000;"> callable(key_func):
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> key_func
</span><span style="color: #0000ff;">else</span><span style="color: #000000;">:
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> import_string(key_func)
</span><span style="color: #0000ff;">return</span> default_key_func</pre>
使用内存
CACHES =: : </span><span style="color: #008000;">#</span><span style="color: #008000;"> 注:其他配置同开发调试版本</span></pre>
使用文件
=: :
使用数据库
<span style="color: #008000;">#</span><span style="color: #008000;"> 配置:</span>
CACHES =<span style="color: #000000;"> {
</span><span style="color: #800000;">'</span><span style="color: #800000;">default</span><span style="color: #800000;">'</span><span style="color: #000000;">: {
</span><span style="color: #800000;">'</span><span style="color: #800000;">BACKEND</span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">django.core.cache.backends.db.DatabaseCache</span><span style="color: #800000;">'</span><span style="color: #000000;">,</span><span style="color: #800000;">'</span><span style="color: #800000;">LOCATION</span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">my_cache_table</span><span style="color: #800000;">'</span>,<span style="color: #008000;">#</span><span style="color: #008000;"> 数据库表</span>
<span style="color: #000000;"> }
}
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 注:执行创建表命令 python manage.py createcachetable</span></pre>
使用memcache缓存(python-memcached模块)
=: : CACHES </span>=<span style="color: #000000;"> {
</span><span style="color: #800000;">'</span><span style="color: #800000;">default</span><span style="color: #800000;">'</span><span style="color: #000000;">: {
</span><span style="color: #800000;">'</span><span style="color: #800000;">BACKEND</span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">django.core.cache.backends.memcached.MemcachedCache</span><span style="color: #800000;">'</span><span style="color: #000000;">,</span><span style="color: #800000;">'</span><span style="color: #800000;">LOCATION</span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">unix:/tmp/memcached.sock</span><span style="color: #800000;">'</span><span style="color: #000000;">,}
}
CACHES </span>=<span style="color: #000000;"> {
</span><span style="color: #800000;">'</span><span style="color: #800000;">default</span><span style="color: #800000;">'</span><span style="color: #000000;">: {
</span><span style="color: #800000;">'</span><span style="color: #800000;">BACKEND</span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">django.core.cache.backends.memcached.MemcachedCache</span><span style="color: #800000;">'</span><span style="color: #000000;">,</span><span style="color: #800000;">'</span><span style="color: #800000;">LOCATION</span><span style="color: #800000;">'</span><span style="color: #000000;">: [
</span><span style="color: #800000;">'</span><span style="color: #800000;">172.19.26.240:11211</span><span style="color: #800000;">'</span><span style="color: #000000;">,</span><span style="color: #800000;">'</span><span style="color: #800000;">172.19.26.242:11211</span><span style="color: #800000;">'</span><span style="color: #000000;">,]
}
}</span></pre>
使用Memcache缓存(pylibmc模块)
=: CACHES </span>=<span style="color: #000000;"> {
</span><span style="color: #800000;">'</span><span style="color: #800000;">default</span><span style="color: #800000;">'</span><span style="color: #000000;">: {
</span><span style="color: #800000;">'</span><span style="color: #800000;">BACKEND</span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">django.core.cache.backends.memcached.PyLibMCCache</span><span style="color: #800000;">'</span><span style="color: #000000;">,</span><span style="color: #800000;">'</span><span style="color: #800000;">LOCATION</span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">/tmp/memcached.sock</span><span style="color: #800000;">'</span><span style="color: #000000;">,}
}
CACHES </span>=<span style="color: #000000;"> {
</span><span style="color: #800000;">'</span><span style="color: #800000;">default</span><span style="color: #800000;">'</span><span style="color: #000000;">: {
</span><span style="color: #800000;">'</span><span style="color: #800000;">BACKEND</span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">django.core.cache.backends.memcached.PyLibMCCache</span><span style="color: #800000;">'</span><span style="color: #000000;">,]
}
}</span></pre>
缓存应用
单独视图缓存
<span style="color: #0000ff;">from django.views.decorators.cache <span style="color: #0000ff;">import<span style="color: #000000;"> cache_page
@cache_page(60 * 15<span style="color: #000000;">)
<span style="color: #0000ff;">def<span style="color: #000000;"> my_view(request):
...
方式二:
<span style="color: #0000ff;">from django.views.decorators.cache <span style="color: #0000ff;">import<span style="color: #000000;"> cache_page
urlpatterns </span>=<span style="color: #000000;"> [
url(r</span><span style="color: #800000;">'</span><span style="color: #800000;">^foo/([0-9]{1,2})/$</span><span style="color: #800000;">'</span>,cache_page(60 * 15<span style="color: #000000;">)(my_view)),]
即通过装饰器的方式实现,导入模块之后,在需要缓存的函数前加@cache_page(60 15) 6015表示缓存时间是15分钟
局部使用
{</span>% load cache %<span style="color: #000000;">}
b. 使用缓存
{</span>% cache 5000 缓存key %<span style="color: #000000;">}
缓存内容
{</span>% endcache %}</pre>
全站缓存
MIDDLEWARE </span>=<span style="color: #000000;"> [
</span><span style="color: #800000;">'</span><span style="color: #800000;">django.middleware.cache.UpdateCacheMiddleware</span><span style="color: #800000;">'</span><span style="color: #000000;">,</span><span style="color: #008000;">#</span><span style="color: #008000;"> 其他中间件...</span>
<span style="color: #800000;">'</span><span style="color: #800000;">django.middleware.cache.FetchFromCacheMiddleware</span><span style="color: #800000;">'</span><span style="color: #000000;">,]
CACHE_MIDDLEWARE_ALIAS </span>= <span style="color: #800000;">""</span><span style="color: #000000;">
CACHE_MIDDLEWARE_SECONDS </span>= <span style="color: #800000;">""</span><span style="color: #000000;">
CACHE_MIDDLEWARE_KEY_PREFIX </span>= <span style="color: #800000;">""</span></pre>
<table style="height: 30px; background-color: #afeeee; width: 1266px; ; width: 1266px;" border="0">
<tr>
<td><span style="font-size: 16px;">七、Django中的信号</td>
</tr></table>
简介
Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。
内置信号
post_init
pre_save
post_save
pre_delete
post_delete
m2m_changed
class_prepared
post_migrate
Request/
request_finished
got_request_exception
template_rendered
因为这些信号中并没有注册函数,所以运行时并没有调用触发这些信号
对于Django内置的信号,仅需注册指定信号,当程序执行相应操作时,自动触发注册函数
django.core.signals request_finished
django.core.signals request_started
django.core.signals got_request_exception
<span style="color: #0000ff;">from
django.db.models.signals <span style="color: #0000ff;">import class_prepared <span style="color: #008000;">#<span style="color: #008000;"> 程序启动时,检测已注册的app中的modal类,对于每一个类,自动触发
<span style="color: #0000ff;">from django.db.models.signals <span style="color: #0000ff;">import pre_init,post_init <span style="color: #008000;">#<span style="color: #008000;"> 构造方法前和构造方法后
<span style="color: #0000ff;">from django.db.models.signals <span style="color: #0000ff;">import pre_save,post_save <span style="color: #008000;">#<span style="color: #008000;"> 对象保存前和对象保存后
<span style="color: #0000ff;">from django.db.models.signals <span style="color: #0000ff;">import pre_delete,post_delete <span style="color: #008000;">#<span style="color: #008000;"> 对象删除前和对象删除后
<span style="color: #0000ff;">from django.db.models.signals <span style="color: #0000ff;">import m2m_changed <span style="color: #008000;">#<span style="color: #008000;"> 操作第三张表前后
<span style="color: #0000ff;">from django.db.models.signals <span style="color: #0000ff;">import pre_migrate,post_migrate <span style="color: #008000;">#<span style="color: #008000;"> 执行migrate命令前后
<span style="color: #0000ff;">from django.test.signals <span style="color: #0000ff;">import setting_changed <span style="color: #008000;">#<span style="color: #008000;"> 使用test测试修改配置文件时
<span style="color: #0000ff;">from django.test.signals <span style="color: #0000ff;">import template_rendered <span style="color: #008000;">#<span style="color: #008000;"> 使用test测试渲染模板时
<span style="color: #0000ff;">from django.db.backends.signals <span style="color: #0000ff;">import connection_created <span style="color: #008000;">#<span style="color: #008000;"> 创建数据库连接时
<span style="color: #0000ff;">def callback(sender,**<span style="color: #000000;">kwargs):
<span style="color: #0000ff;">print(<span style="color: #800000;">"<span style="color: #800000;">xxoo_callback<span style="color: #800000;">"<span style="color: #000000;">)
<span style="color: #0000ff;">print<span style="color: #000000;">(sender,kwargs)
xxoo.connect(callback)
<span style="color: #008000;">#<span style="color: #008000;"> xxoo指上述导入的内容#示例
from django.core.signals import request_finished
from django.dispatch import receiver
@receiver(request_finished)
def my_callback(sender,**kwargs):
print("Request finished!")<span style="color: #008000;">########################说明####################
自定义信号
步骤:
示例:
=django.dispatch.Signal(providing_args=[,<span style="color: #008000;">#<span style="color: #008000;">注册信号
<span style="color: #0000ff;">def callback(sender,**<span style="color: #000000;">kwargs):
</span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">"</span><span style="color: #800000;">callback</span><span style="color: #800000;">"</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">print</span><span style="color: #000000;">(sender,kwargs)
pizza_done.connect(callback)
<span style="color: #008000;">#<span style="color: #008000;">触发信号
<span style="color: #0000ff;">from 路径 <span style="color: #0000ff;">import<span style="color: #000000;"> pizza_done
pizza_done.send(sender
=<span style="color: #800000;">'<span style="color: #800000;">seven<span style="color: #800000;">',toppings=123,size=456)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。
相关推荐
注:所有源代码均实测运行过。所有源代码均已上传CSDN,请有需要的朋友自行下载。
继承APIView和ViewSetMixin;作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。ViewSet在开发接口中不经常用。
一、Django介绍Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。Django 是一个开放源代码的 Web 应用框架,由 Python 写成。Django 遵守 BSD 版权,初次发布于 2005 年 7 月, 并于 2008 年 9 月发布了第一个正式版本 1.0 。Django学习线路Django 采用了 MVT 的软件设计模式,即模型(Model),视图(View)和模板(Template)。这个MVT模式并
本文从nginx快速掌握到使用,gunicorn快速掌握到使用,实现小白快速搭建django项目,并对可能出现的报错进行了分析
Django终端打印SQL语句 1 Setting配置: 2 默认python 使用的MysqlDB连接,Python3 支持支持pymysql 所有需要在app里面的__init__加上下面配置:
url: re_path('authors/$', views.AuthorView.as_view()), re_path('book/(?P\d+)/$', vie
前提 关于html寻找路线: template 如果在各个APP中存在, Django 会优先找全局template 文件下的html文件,如果全局下的template文件没有相关的html Djan
// GET请求request.GET // POST请求request.POST // 处理文件上传请求request.FILES // 处理如checkbox等多选 接受列表request.get
from bs4 import BeautifulSoup#kindeditordef kindeditor(request): s = ''' <li><s
from django.http import JsonResponse JsonResponse 里面代码会加这一个响应头 kwargs.setdefault('content_type&#
#下面两种是基于QuerySet查询 也就是说SQL中用的jion连表的方式查询books = models.UserInfo.objects.all() print(type(books)) >
return HttpResponse("OK") 返回一个字符串 return redirect("/index/") 返回URL return render
from django.http import JsonResponse JsonResponse 里面代码会加这一个响应头 kwargs.setdefault('content_type&#
浏览器有一个很重要的概念——同源策略(Same-Origin Policy)。所谓同源是指,域名,协议,端口相同。不同源的客户端脚本(javascript、ActionScript)在没明确授权的情况
自动发送 > 依赖jQuery文件 实例-->GET请求: 手动发送 > 依赖浏览器XML对象(也叫原生ajax) Ajax主要就是使用 【XmlHttpRequest】对象来完成请
#下面两种是基于QuerySet查询 也就是说SQL中用的jion连表的方式查询books = models.UserInfo.objects.all() print(type(books)) >
// GET请求request.GET // POST请求request.POST // 处理文件上传请求request.FILES // 处理如checkbox等多选 接受列表request.get
return HttpResponse("OK") 返回一个字符串 return redirect("/index/") 返回URL return render