一:Django简介
Django是一个优秀的Web框架。
Django是一个MTV框架。
二:路由配置
1.在Project下的urls.py中的urlpatterns变量所指向的 列表中添加路由,path('第一部分url',include('应用中的urls模块'))
2.在应用中的urls模块(自己创建)中urlpatterns变量所指向的列表中添 加路由,path('第二部分url',视图函数名)
三:视图函数
视图函数存在于应用(app)中的views.py模块中,视图函数的第一个参数必须 是请求对象,而且还要返回响应对象。
1. 直接返回HttpResponse
直接将html代码编入HttpResponse的构造函数中。
eg: def hello(request): return HttpResponse("
Hello Django
")
2. 通过render()函数返回HttpResponse对象
render('request请求对象','模版名称')
注意:模版存在于templates目录下。
四:请求对象
请求对象request可以判断请求方式(request.method), 也可以接收请求数据, eg:request.POST.get('username','没有username参数')。
django3
一:模版继承
在基础模版中添加{% block 标签名 %} {% endblock %}可以使子模版来进行 继承、添加、覆盖标签中的内容。
子模版继承父模版: {% extends 父模版位置 %}
二:Django的Model(模型)
Model层用来与数据库交互。
1. 安装MySQL数据的适配器 pip install mysqlclient
2. 在项目的配置文件settings.py配置数据库连接信息
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mydb',
'USER':'root',
'PASSWORD':'123456',
'HOST':'localhost',
'PORT':3306,
} }
3. 在setttings.py中的INSTALLED_APPS中加入新建的app名称
4. 在app应用的models.py中创建模型类,模型类必须要继承django.db.models.Model类。
模型类的类属性对应于数据表的字段名;
模型类对应于表(表名是app名称_小写模型类名);
根据模型类创建的数据表中会自动创建一个自增的主键id。
5. python manage.py makemigrations 注册模型
6. python manage.py migrate
根据模型类创建数据表
三:常用操作:
1. 插入操作(通过程序向表中插入记录)
eg: stu = Student(name='tom',sex='男',score=83.5) stu.save()
2. 更新操作
使用与数据表中对应的对象,调用save()方法 stu.score = 90 stu.save()
3. 查询操作
查询所有:
Student.objects.all()返回包含了所有记录的
结果集对象(QuerySet)
返回的结果集对象可以通过for...in遍历,
也可以使用索引访问其中的某个元素。
查询单条记录:
Student.objects.get(id=1) 只能返回一条记录,如果多于1条或没有查询到则引发异常
根据过滤条件查询 Student.objects.filter(score=90) 返回的结果集对象可以通过for...in遍历,也可以 使用索引访问其中的某个元素。
4. 删除操作
单条删除 Student.objects.get(id=1).delete()
多条删除 Student.objects.all().delete()
第四天
关系表设计
1. “一对多”关系表设计 在“多”方设置外键(foreign key),关联父表(主表)的主键。
例子:
添加学校记录:
school1 = School(school_name='清华大学',school_address='北京')
school1.save()
或者 School.objects.create(school_name='南开大学',school_address='天津')
添加学生记录(要进行关联学校记录)
通过学校的实例化对象关联
stu4 = Student(name="李红",sex='女',score=82,school=school1) stu4.save()
通过学生的外键列名关联学校的id
stu4 = Student(name="李红",sex='女',score=82,school_id=24)
stu4.save()
查询学校编号为23或25的学生记录。
Student.objects.filter(school_id__in =(23,25))
查询学号大于9的学生记录
results = Student.objects.filter(id__gt =9)
# 查询出的是QuerySet对象
for stu in results:
print(stu.name)
2. "多对多"关系表设计
通过设置“中间表”来关联两个“多”表。中间表中至少有两个外键字段,分别关联于两个“多”表的主键。
在Django的models.py中需要完成三个模型:
class Author(models.Model):
name = models.CharField(max_length=20)
home = models.CharField(max_length=20)
class Book(models.Model):
bookname = models.CharField(max_length=20)
bookprice = models.FloatField() a
uthor = models.ManyToManyField(Author,through="Author_Book")
中间关系模型:
class Author_Book(models.Model):
author = models.ForeignKey(Author,on_delete=models.CASCADE)
book = models.ForeignKey(Book,on_delete=models.CASCADE)
插入“多”方表数据:
author1 = Author(name='金庸',home='香港')
author1.save() # 或使用Author.objects.create(name='金庸',home='香港')
book1 = ... 通过中间模型对象插入中间表数据:
ab1 = Author_Book(author=author1,book=book1)
ab1.save()
从多方查询另一方数据:
从主动多方(调用了ManyToManyField方法())
查询另一个多方: book3.author.all()
从被动多方查询另一个多方: author1.book_set.all()
第五天一:
url反向(逆向)解析
url反向(逆向)解析:通过视图函数解析url的过程。
步骤:
1. 在项目的urls.py(总路由模块)中的include()函数中,添加 namespace参数,确定包含的应用路由模块对应的"命名空间"。
eg: path('myapp/',include('myapp.urls',namespace="war")),
2. 在include()函数包含的模块(一般为应用路由模块urls.py 中,添加app_name = '应用名称'。 eg: app_name = 'myapp'
3. 在应用路由模块的path()函数中添加name关键字实参,代表视图 函数的别名。
eg: path('detail//',student_detail,name="studetail")
4. 在要进行url反向解析的模版中使用{% url %}标签动态生成url。 eg: {{ stu.name }} 注意:可以在{% url "namespace:视图别名" 传递的参数 %} 将参数传递给反向解析生成的url。二:Cookie与Session Cookie与Session的区别与联系:
区别:Cookie在服务器端生成,但保存于客户端;Session保存于服务器端。
Cookie的安全性较低(因为Cookie保存于客户端);Session安全性高。 Session代表会话,用来跟踪客户端一系列的请求,识别客户端。
联系: 客户端发送请求时,通过请求头信息中携带sessionid的那个cookie, 将这个Cookie的值取出来与服务端的Session进行比对,用来寻找当前 请求属于哪个会话。 在Django的settings.py中可以设置 SESSION_EXPIRE_AT_BROWSER_CLOSE = True,表示当浏览器关闭的时候,清除本地 Cookie,重启浏览器时,则找不到服务端的Session。 如何在服务端设置Cookie? 使用HttpResponse对象的set_cookie(key,value,max_age="该Cookie过期秒数") 注销session可使用del request.session["key名称"],也可通过 request.session.set_expiry(value)设置session过期秒数
第六天一:
退出登录(注销)的方式:
1. del request.session["属性名"]
2. request.session.set_expiry(value)设置session过期秒数
重定向:从客户端的角度看,发送了多次请求。
重定向方式之一: 通过返回HttpResponseRedirect("重定向地址")
二:静态资源的引入 在setttings.py中配置: STATIC_URL = '/static/' 默认,用来映射真实地址 STATICFILES_DIRS = (,...) 配置公共静态资源所在的目录三:上传文件 1. 表单上传文件 注意:表单上传文件时,要封装表单:给标签设置
enctype="multipart/form-data"属性。
upload_obj = request.FILES.get('myfile') # 接收上传数据
print("上传来的文件名是:",upload_obj.name)
destfile = os.path.join(BASE_DIR,"uploaddata","pic",upload_obj.name)
print("目标承载文件",destfile)
with open(destfile,'wb') as f:
for chunk in upload_obj.chunks():
f.write(chunk)
return render(request,'upload/success.html',{'path':"/static/pic/"+upload_obj.name})
2. Ajax上传文件
var formData = new FormData(); // FormData用来收集数据
var upload_file = $("#upload")[0].files[0]; // 获取上传文件的数据
formData.append("upload_data",upload_file); // 将上传文件数据添加到formData对象中
$.ajax({
url:"/upload/ajax/",
data:formData,
type:"POST",
processData:false, // 不希望转换的信息,请设置为 false
contentType:false, // 传递false来告诉jQuery,没有设置任何内容类型头信息
dataType:"json",
success:function (jsobj) {
$("#upimg").attr("src",jsobj.path).css("display","block");
}
});
第七天
一:admin后台管理
1. 创建超级用户
python manage.py createsuperuser
2. 将应用添加到setttings.py中的INSTALLED_APPS列表中。
3. 在应用中编写模型类,并迁移(同步)至数据库。
4. 在该应用的admin.py中注册模型(使admin后台能对该应用的模型进行管理)
admin.site.register([模型类,...])
二:Paginator分页器的使用
1.Paginator对象的常用方法与属性
page(页码)方法 :根据页码返回当前页在数据库中对应的数据,返回的对象是Page对象
num_pages属性:总页数
page_range: 所有页码范围
2. Page对象的常用方法:
注意:Page对象是能被遍历的
has_previous() 是否存在前一页
previous_page_number() 前一页
has_next() 是否存在下一页
next_page_number() 后一页
补充:locals() 返回包含当前作用域的局部变量的字典。
第八天
一:自定义错误页面
配置settings.py
DEBUG = False
ALLOWED_HOSTS = ["允许访问的主机"]
handler500 = 处理相应异常的视图函数
python manage.py runserver --inscure
二:Django缓存
第一种缓存:memcached缓存
准备工作:
1.安装memcached
memcached -d install
2.启动memcached服务
net start "Memcached Server"
3.使用PyCharm安装python-memcached包
通过Python操作memcached数据库(简单操作):
import memcache
c = memcache.Client(["127.0.0.1:11211"]) # 实例化memcached客户端对象
c.set('key1','value1') # 保存键值对
c.get('key1') # 通过key1查找对应的值
c.set('key2','value2',30) # 给该键值对设置30秒的过期时间
settings.py配置:
CACHES = {
'default':{
'BACKEND':'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION':'127.0.0.1:11211',
}
}
第二种缓存:数据库表缓存(eg:MySQL)
创建缓存表:
python manage.py createcachetable mycachetable
CACHES = {
'default':{
'BACKEND':'django.core.cache.backends.db.DatabaseCache',
'LOCATION':'mycachetable',
}
}
注意:对相同视图调用的结果缓存,使用下面的装饰器:
@cache_page(缓存时间)
python1802史哓楠 21:15:45
sudo apt-get install gdebi
python1802史哓楠 21:18:25
sudo gdebi sogoupinyin_2.2.0.0108_amd64.deb