1 学的不好的同学:用ajax提交一个json格式数据,返回一个json格式数据,console.log打印出来

2 通过ajax上传一个文件并保存起来,前端接收到,弹窗说上传成功

urls.py

from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.add),
path('files/', views.files),
]

views.py

from django.shortcuts import render,HttpResponse
# Create your views here. import json
def add(request):
if request.is_ajax():
json_dict = json.loads(request.body)
print(json_dict)
dic1 = {'msg':'you is very good'}
return HttpResponse(json.dumps(dic1))
return render(request,'add.html') def files(request):
if request.is_ajax():
myfile = request.FILES.get('myfile')
from django.core.files.uploadedfile import InMemoryUploadedFile
name = myfile.name
with open(name,'wb') as f:
for line in myfile:
f.write(line)
return render(request,'add.html')

add.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
{% load static %}
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<p>用户名:<input type="text" id="d1" value="joab"></p>
<p>密码:<input type="text" id="d2" value="123"></p>
<p>文件:<input type="file" id="d3"></p>
<button id="d4">发送ajax请求</button>
<button id="d5">发送ajax文件</button>
</body>
<script> $('#d4').click(function () {
$.ajax({
url:'',
type: 'post',
data:JSON.stringify({'username':$('#d1').val(),'password':$('#d2').val()}),
contentType:'application/json',
success:function (data) {
console.log(data)
} })
})
$('#d5').on('click',function () {
let formDataObj = new FormData();
formDataObj.append('myfile',$('#d3')[0].files[0])
$.ajax({
url:'/files/',
type: 'post',
data:formDataObj,
contentType: false,
processData:false,
success:function (args) {
alert('上传成功')
}
})
}) </script>
</html>

3 大家都写的:

用ajax提交用户的注册信息(用户名,密码,确认密码,年龄)(json),form组件做认证,姓名要大于4,小于16,不能以sb开头和结尾,用户名如果存在,也不能存进去,密码(最大16位,最小4位),年龄,小于150,大于18岁,密码和确认密码要一致,校验通过,存到user表中,

urls.py

from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.register),
]

views.py

from django.shortcuts import render
from app01.myforms import MyRegForm
from app01 import models
from django.http import JsonResponse
# Create your views here. import json
def register(request):
form_obj = MyRegForm()
if request.is_ajax():
back_dic = {'code': 1000, 'msg': ''}
json_dict = json.loads(request.body)
form_obj = MyRegForm(json_dict)
print(json_dict)
if form_obj.is_valid(): clean_data = form_obj.cleaned_data
clean_data.pop('re_password')
print(clean_data)
#写入数据库
models.UserInfo.objects.create_user(**clean_data)
else:
back_dic['code'] = 2000
back_dic['msg'] = form_obj.errors
return JsonResponse(back_dic) return render(request,'register.html',locals())

settings.py需要在配置文件中告诉django你要用UserInfo替代auth_user(******)

AUTH_USER_MODEL = 'app01.UserInfo'

modles.py给原生的user表加额外字段

from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
class UserInfo(AbstractUser):
age = models.IntegerField(verbose_name='年龄')

register.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body class="text-center">
<form id="myform">
<h1>注册</h1>
{% for form in form_obj %}
<p><label for="{{ form.auto_id }}">{{ form.label }}</label>
{{ form }}
<span style="color: red"></span>
</p>
{% endfor %}
<input type="button" class="btn btn-primary" value="注册" id="id_commit">
</form>
</body>
<script>
$('#id_commit').click(function () {
$.ajax({
url:'',
type:'post',
data:JSON.stringify({'username':$('#id_username').val(),'password':$('#id_password').val(),
're_password':$('#id_re_password').val(),'age':$('#id_age').val()
}),
contentType:'application/json',
success:function (args) {
if (args.code==1000){
alert('注册成功')
}else {
console.log(args.msg)
$.each(args.msg,function (index,obj) {
let targetId = '#id_' + index;
$(targetId).next().text(obj[0]).parent().addClass('has-error')
})
}
}
})
})
</script>
</html>

利用forms组件渲染,校检数据

app01下创建myforms.py

from app01 import models
from django import forms class MyRegForm(forms.Form):
username = forms.CharField(label='用户名', max_length=16, min_length=4, error_messages={
'required': '用户名不能为空',
'max_length': '最大16位',
'min_length': '最小4位',
})
password = forms.CharField(label='密码', max_length=16, min_length=4, error_messages={
'required': '密码不能为空',
'max_length': '最大16位',
'min_length': '最小4位',
})
re_password = forms.CharField(label='确认密码', max_length=16, min_length=4, error_messages={
'required': '确认密码不能为空',
'max_length': '最大16位',
'min_length': '最小4位',
})
age = forms.IntegerField(label='年龄', max_value=150, min_value=18, error_messages={
'required': '年龄不能为空',
'max_value': '最大150岁',
'min_value': '最小18岁',
}) # 局部钩子
def clean_username(self):
username = self.cleaned_data.get('username')
# 数据库中校检数据
is_exist = models.UserInfo.objects.filter(username=username)
print(is_exist)
if is_exist:
self.add_error('username', '用户名已存在')
return username # 全局钩子
def clean(self):
password = self.cleaned_data.get('password')
re_password = self.cleaned_data.get('re_password')
if not password == re_password:
self.add_error('re_pwd', '两次密码不一致')
return self.cleaned_data

4 读一下forms执行流程

5 自己手动实现一个存文件的session,自定制一个session字典

urls.py

from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.my_seesion),
]

views.py

from django.shortcuts import render,HttpResponse
from django.contrib.auth.models import auth
from app01 import models
# Create your views here. #随机字符串
def str1():
import hashlib
import random
res = ''
for i in range(3):
s1 = chr(random.randint(65, 90))
s2 = str(random.randint(0, 9))
res += random.choice([s1, s2])
print(res)
m = hashlib.md5()
m.update(res.encode('utf-8'))
m.update('aaa'.encode('utf-8'))
return m.hexdigest() def my_seesion(request):
if request.method == 'POST':
print(request.myseesion)
username = request.POST.get('username')
password = request.POST.get('password')
user_obj = auth.authenticate(request,username=username,password=password)
if user_obj:
suijistr = str1()
print(suijistr)
request.myseesion['myseesionid'] = suijistr
is_exist = models.MySession.objects.filter(username=username)
if is_exist:
models.MySession.objects.filter(username=username).update(val=suijistr)
else:
models.MySession.objects.create(username=username,mysessionid='mysessionid',val=suijistr)
return HttpResponse('登录成功')
else:
return HttpResponse('登录失败')
return render(request,'my_seesion.html')

my_seesion.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body class="text-center">
<form action="" method="post">
{% csrf_token %}
username:
<p><input type="text" name="username"></p>
password:
<p><input type="password" name="password"></p>
<input type="submit" class="btn btn-primary" value="登录">
</form>
</body>
</html>

modles.py

from django.db import models
# Create your models here. class MySession(models.Model):
username = models.CharField(verbose_name='用户名',max_length=100)
mysessionid = models.CharField(max_length=200)
val = models.CharField(max_length=300)

app01下自定义中间件

mysession.py

from django.contrib.auth.models import auth
from django.shortcuts import render,HttpResponse
from app01 import models from django.utils.deprecation import MiddlewareMixin
class MySession(MiddlewareMixin):
def process_response(self,request,response):
user_obj = models.MySession.objects.get(username=request.user)
response.set_cookie('myseesionid',user_obj.val)
return response def process_request(self,request):
request.myseesion = {}
llq = request.COOKIES.get('myseesionid')
if llq:
print(llq)
fwq = models.MySession.objects.get(username=request.user)
fwq = fwq.val
if not llq == fwq:
return HttpResponse('cookie不对')
else:
request.myseesion.update({'myseesionid':fwq})

 settings.py添加中间件

MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'app01.mysession.MySession',
]

6 敲一遍bbs项目

线下---复习day04---作业的更多相关文章

  1. 线下---复习day04

    目录 1 Django与Ajax 2分页器组件 3 forms组件 4cookie与session组件 5中间件组件 6Auth模块 作业: 1 Django与Ajax # 通过ajax向https: ...

  2. 线下---复习day03

    目录 django回顾 1 web应用,http协议,web框架 2 django请求生命周期 3 路由控制 4 视图层 5 模板层 6 模型层 django回顾 1 web应用,http协议,web ...

  3. 线下---复习day02

    目录 1 后续课程安排 2 作业讲解 3 python中的魔法方法 setattr,getattr,setitem,getitem演示 with 上下文管理器 eq 4 cookie,session, ...

  4. 线下---复习day01

    目录 1 个人介绍 2 关于编辑器 3 基础串讲 3.1 解释型和编译型 3.2 数据类型 3.2.1 一切皆对象 3.2.1 深浅copy 3.2.3 可变类型与不可变类型 3.3 字符编码 3.4 ...

  5. .NET Core 成都线下面基会拉开序幕

    2017年07月29日下午,由 .NET China Foundation 成都小组组织的 .NET Core 成都地区线下技术交流会在成都成华区某茶楼成功举行,这也是成都地区 .NET Core 非 ...

  6. 这个立冬,我线下面基了一位TMD高级专家,太牛逼了!

    立冬刚过,迎面而来的是一股寒气.天气如此,市场亦是如此.昨天周五,和1个认识的技术专家老刘约饭,也算是线下面基,增进感情.每年我都要向比我高阶的朋友讨教.不由自主聊到了他的职场生涯.鱼哥一直以为自己命 ...

  7. 用实力燃爆暑期丨i春秋渗透测试工程师线下就业班开课了!

    i春秋&赛虎暑期渗透测试工程师线下就业班开课了! 本期开班地点:北京,面授脱产:四个月. 如果这次没来得及报名的同学也可以选择9月份广州的班次,具体开班时间请咨询谢老师:18513200565 ...

  8. 课下选做作业MyOD

    2019-2020-1 20175227 <信息安全系统设计基础> 课下选做作业MyOD 要求 复习c文件处理内容 编写myod.c 用myod XXX实现Linux下od -tx -tc ...

  9. YY一下微信线下支付的场景

    在上一篇文章里面提到了 <跨行清算的实现原理>,这次来分析一下线下支付的场景和流程. 今天看到一篇文章:http://www.huxiu.com/article/23248/1.html? ...

随机推荐

  1. mysql基础-数据类型和sql模式-学习之(三)

    0x01 mysql的两种方向: 开发DBA:数据库设计(E-R关系图).sql开发.内置函数.存储历程(存储过程和存储函数).触发器.时间调度器(event scheduler) 运维----> ...

  2. profile(/etc/profile)和bash_profile的区别

    profile(/etc/profile)和bash_profile的区别 profile(/etc/profile),用于设置系统级的环境变量和启动程序,在这个文件下配置会对所有用户生效.当用户登录 ...

  3. Spring之多数据源切换的应用

    这不是一个新的知识点扩展,顶多算是,Spring的AOP特性的一个应用.那么下面开始今天的学习之旅! 场景 数据库读写分离,或者分库,总之多数据源的场景,怎么样实现自动切换(PS:不考虑各种分库分表的 ...

  4. pytest 多个PY文件执行共享变量及用fixture和conftest

    ------------恢复内容开始------------ 1.pytest需要测试多个py文件,这些文件有一定的依赖关系,同时执行的时候,需要只执行一次初始化setup,结束再执行一次teardo ...

  5. Quartz.Net系列(三):解读Quartz.Net源码领略设计模式在其中的应用

    1.Builder(建造者)模式 JobBuilder  DateBuilder  其他的Builder(TriggerBuilder.SchedulerBuilder等) 2.抽象工厂模式 ISch ...

  6. Activity学习笔记1

    Activity概述 简单的理解Activity就是指Android手机或平板的一个屏,类似Window的一个窗口,浏览器的一个页面. Activity的4种状态 Activity的生命周期 创建Ac ...

  7. ComplexHeatmap|根据excel表绘制突变景观图(oncoplot)

    本文首发于“生信补给站”:https://mp.weixin.qq.com/s/8kz2oKvUQrCR2_HWYXQT4g 如果有maf格式的文件,可以直接oncoplot包绘制瀑布图,有多种展示和 ...

  8. vc++,MfC ,cstring与char相互转换知识

    //mapName = mapString;//----------------------原始- string mapName; CString strtemp,strtemp2; //char t ...

  9. opencv C++矩阵操作

    int main(){ cv::Mat src1=(cv::Mat_<float>(2,3)<<1,2,3,4,5,6); cv::Mat src2=(cv::Mat_< ...

  10. Linux Pam后门总结拓展

    首发先知社区: https://xz.aliyun.com/t/7902 前言 渐渐发现pam后门在实战中存在种植繁琐.隐蔽性不强等缺点,这里记录下学习pam后门相关知识和pam后门的拓展改进. 0x ...