Django 全阶段

一: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

你可能感兴趣的:(Django 全阶段)