django深入
路由系统
- 如果要把一个项目的urls传到子级app里面
+ url(r'app01/',include("app01.urls")),
+ settings里面需要注册下
+ 然后再app01里面创建文件urls.py
+ url(r'index/$',views.index),
+ 这样,访问127.0.0.1:8000/app01/index/的时候就可以访问到app01底下的views.index
- url(r'^user_list/(?P<v1>\d+)/(?P<v2>\d+)',views.user_list)
+ 两个参数分别是v1 和v2
- 基于反射对应url
+ 反射比直接执行的效率要低
中间件
- middleware
+ 需要值setting里面注册
+ 如果自己新建的middleware,必须是一个包,才能引用到。
+ 'middleware.my_middleware1.my_middle_1',
- 所有中间件中必须有
+ process_view(self, request, callback, callback_args, callback_kwargs)
+ process_response(self, request, response)
- 其他方法
+ process_request(self,request)
+ process_exception(self, request, exception)
- 执行的顺序
+ process_request(self,request)
+ process_view(self, request, callback, callback_args, callback_kwargs)
+ process_exception(self, request, exception)
+ process_response(self, request, response)
- 执行的过程
+ 请求
+ Django自动去settings里面去找middleware_classes,元组
+ for 类 in middleware_class:
obj = 类()
如果有 obj.process_request 方法。那么把这个方法放到
process_request_list 方法中
挨个找。
最后执行process_request_list中的所有方法
mmm.process_request
xxx.process_request
还有view的和response的
mmm.process_view
xxx.process_view
mmm.process_response
xxx.process_response
- 如果request 有返回值
+ httpresponse
+ 直接到response,返回的过程必须都response执行一遍。
- 如果有exception
+ 所有exeption都要执行一遍,执行完之后再给response
+ 所有response都执行一遍
- 如果有exception,而且exception中有返回值
+ 直接到response,不再执行接下来的exception
+ 所有response都执行一遍
model(数据库操作)(重点)
创建表
操作表数据
Form (重点)
- 用户提交数据的验证
from django import forms
from django.core.exceptions import ValidationError
#定义一个表单类,要继承forms.Form,里面定义的是表单的的字段,生成的表单里面的id是 "id_字段名"
class user_info(forms.Form):
email = forms.EmailField()
host = forms.CharField()
#上面两个只是普通的字段,下面加一个下拉选择的
user_type_choice = (
(0, u'普通用户'),
(1, u'高级用户'),
)
user_type = forms.IntegerField(widget=forms.widgets.Select(choices=user_type_choice, attrs={'class': "form-control"}))
# 上面这个是用户类型选择
# widge 这个控制是什么标签 比如select textinput等,然后里面可以设置属性
#再来一个 Field里面的关键字
title = forms.CharField(max_length=20,
min_length=5,
error_messages={'required': u'标题不能为空',
'min_length': u'标题最少为5个字符',
'max_length': u'标题最多为20个字符'},
widget=forms.TextInput(attrs={'class': "form-control",'placeholder': u'标题5-20个字符'}))
还有ValidationError 判断输入是否有效。是否引起异常
def mobile_validate(value):
mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
if not mobile_re.match(value):
raise ValidationError('手机号码格式错误')
然后再class 里面添加 validators
phone = forms.CharField(validators=[mobile_validate, ],
error_messages={'required': u'手机不能为空'},
widget=forms.TextInput(attrs={'class': "form-control",'placeholder': u'手机号码'}))
#定义表单处理函数
def form_test(request):
obj = user_info()
if request.method == 'POST':
user_input_obj = user_info(request.POST)
if user_input_obj.is_valid():
print user_input_obj.clean()
else:
error_msg = user_input_obj.errors
print error_msg
return render(request,"form.html",{"obj":obj,"error_msg":error_msg})
#html里面处理的时候,如下形式写即可。
{{ obj.host }}<span>{{ error_msg.host }}</span>
user_input_obj.errors.as_data
error_message 有as_ul(默认) as_data as_Json
- 用来生成HTML标签
cookie 和 session
cookie 就是字符串,保存于本机
session 就是保存于服务器
- 保存用户会话信息
- 超时时间,写入cookie的时候会有超时时间
- session依赖cookie
- 自动生产字符串
- 将str发送给客户端浏览器
- 将字符串单位key放到session里面
- 在用户的session对应的value里设置任意值
- request.session[“is_login”]=True
跨站请求伪造,跨站脚本攻击
ajax操作
function ajaxsubmit(){
$.ajax({
url:"/app01/ajax/",
type:'POST',
tradition= True,
data:{"host":$(".host").text(),"port":$(".port").text()},
success: function(args){
console.log(args);
}
});
}
刷新 window.location.href = window.location.href
Admin
缓存
缓存
1. 文件方式
- 在settings里面配置
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': os.path.join(BASE_DIR, 'cache'),
'TIMEOUT': 600,
'OPTIONS': {
'MAX_ENTRIES': 1000
}
}
}
@cache_page(60*15
)
2. 内存方式
3. memcache 方式