django笔记

Djnago

django 模型

  1. 模型字段

    1. boole = models.BooleanField(‘bool 值’, 1)

    2. varchar = models.CharField(‘char 字段’, max_length=10)

    3. date = models.DateField(‘时间’, default=‘2022-11-1’)

      1. DateField 有三个参数,可用选择其中一个参数进行配置。

        1. auto_now:每次保存对象时,自动设置为该字段的当前时间(取值:true/false)

        2. auto_now_add:当对象被第一次创建时自动设置为当前时间值

        3. default:设置当前时间(取值:字符串格式时间,如:‘2016-10-10’)

    4. date2 = models.DateTimeField(‘更为精确的时间’, auto_now=())

      1. DateTimeField 的参数与 DateFiled 相同,也是前面的三个
    5. float = models.FloatField(‘float’)

    6. decimal = models.DecimalField(“小数”, max_digits=5, decimal_places=2)

      1. decimal 的参数有

        1. max_digits:位数总位数,包括小数点后面的位数

        2. decimal_places:小数点后的数字数量

    7. email = models.EmailField(‘邮件’)

      1. email 是 django 利用正则表达式限制 varchar 实现的,邮箱类字段。
    8. Int = models.IntegerField(‘整数’)

    9. img = models.ImageField(‘图片路径’)

      1. img 是 django 用来存储图片路径的字段

text = models.TextField(‘不定长字符串’)

  1. 字段选项
    1. primary——key:设置为 true,表示该字段被设置为主键。如果指定字段为主键后,django 不会自动创建 id 字段。
    2. blank:设置为 true 时,字段可以为空。设置为 false,字段必须填写。
    3. null:如果设置为 true,表示该列,可以为空,默认为 false,(如果设置了 null=false,建议为该列设置 default 值)
    4. default:设置该列的默认值。
    5. db_index:如果设置为 true,表示为该列增加索引。
    6. unique:如果设置为 true,表示该列的值必须唯一,不能重复
    7. db_column:指定列的名词,如果不指定的化,采用属性名作为列明。
    8. verbose_name:设置此字段在 admin 界面上的显示名称。

Django 映射


  1. 一对一关系:

    1. 创建一对一关系:OneToOneFiled(类名,on_delete=xxx)
      1. on_delete(级联删除):
        1. models.CASCADE 级联删除,(ON DELETE CASCADE)删除外键的对象
        2. models.PROTECT 抛出 ProtectedError 阻止被引用对象的删除(RESYTRICT)
        3. SET_NULL 设置 ForeignKey null;需要指定 null=True
        4. SET_DEFAULT 将外键 ForeignKEy 设置为默认值;必须设置 ForeignKey 的默认值.

Cookies And Session


COOKIE :

HttpRespond 调用:

  1. set_cookie(key,value=‘’,max_age=None,expires=None)–>添加或修改 cookie
    1. key:cookie 的名字
    2. value:cookie 的值
    3. max_age:cookie 存活时间,秒为单位
    4. expires:具体过期时间
    5. 当不指定 max_age 和 expires 时,关闭浏览器时,cookie 自动失效
  2. delete_cookie(key)—>删除 cookie
    1. key:cookie 的名字

request 调用:

  1. request.COOKIES :查询 COOKIES 数据
    1. 例:value=request.COOKIES.get(‘cookies 名’,‘默认值’)

SESSION :

  1. 保存 cookie 的值到服务器:
    1. request.session[‘key’]=value
  2. 获取 session 的值:
    1. value=request.session[‘key’]
    2. value=request.session.get(‘key’,默认值)
  3. 删除 session 的值:
    1. del request.session[‘key’]
  4. 命令行,清除过期的 sessionid:
    1. python manage.py clearsessions
  5. setting.py 设置:
    1. 指定 session 在 cookies 中的保存时长(默认为两周)
      1. SESSION_COOKIE_AGE=60*60*24*7*2
    2. 设置浏览器关闭时,将 session 取消.(m 默认为 Fasle)
      1. SESSION_EXPIRE_AT_BROWSER_CLOSE=True
    3. 保证前两个设置有效必须设置以下选项为 true:
      1. SESSION_SAVE_EVERY_REQUEST = True

Djnago Cache


  1. 一 :相关概念与配置

    缓存常用在网页 “数据变动较小且常常需要访问” 的地方.

    将数据加入缓存,可以换取更快的网页访问服务.缓存数据的存储地点在数据库表内.

    1. 配置 django 缓存表. 1. CACHES ={ 'default': { 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', 'LOCATION': 'cache_table', 'TIMEOUT': 300, # 缓存保存时间 单位秒, 默认值 300 'OPTIONS': { 'MAX-ENTRIES': 300, #缓存最大数据条数 'CULL_FREQUENCY': 2, #缓存条数达到最大值时, 删除 1/x 的缓存数据 } } }
  2. 二 :整体缓存策略(作用于整个视图函数)

    1. 在视图函数 使用整体缓存
      1. 导入装饰器:from django.views.decorators.cache import cache_page
      2. 在需要进行缓存的视图函数上添加装饰器:@cache_page(s),–>s 为视图缓存的存储时间,单位秒
    2. 在路由 使用整体缓存
      1. 导入装饰器:from django.views.decorators.cache import cache_page
      2. 在路由中,引入视图函数的位置前,导入装饰品: path(“path/” , cache_page(s) (view.fun))
  3. 二 :局部缓存策略(作用于视图函数内的变量)

    1. 使用 caches 对象
      1. 导入对象: from django.core.cache import caches
      2. cache1=caches[‘setting.py 内 CACHES 字典中的键’]
    2. 直接使用 CACHES 的’default’对象
      1. 导入包:from django.core.cache import cache
      2. 设置存储方法:cache.set(key,value,timeout)
        1. key:缓存的 key,字符串类型
        2. value:python 对象
        3. timeout:缓存的存储时间,默认为 CACHES 中的 TIMEOUT 值
      3. 获取缓存方法:cache.get(key)
        1. key:缓存的 key
        2. 返回 key 的具体值,如果没有数据,返回 None
      4. 存储缓存,只在 key 不存在时生效:cache.add(key,value)
        1. 返回值 true 或者 false

Djnago 中间件


  1. 一 :相关概念与配置

    1. 中间件类必须继承 django.utils.deprecation.MiddlewareMixin 类

    2. 中间件类必须实现下列五个方法中的一个或者多个:

      1. 执行路由前被调用,在每个请求上调用,返回 None 或者 HttpResponse 对象
        1. process_request(self,request):
      2. 执行视图前被调用,在每个请求上调用,返回 None 或者 HttpResponse 对象
        1. process_view(self,request,callback,callback_args,callback_kwargs)
      3. 所有响应返回浏览器 被调用,在每个请求上调用,必须返回 sponse 对象
        1. process_response(self,request,response)
      4. 当处理过程中抛出异常被调用,返回一个 HttpResponse 对象
        1. process_exception(self,request,exception)
      5. 在视图函数执行完毕且视图返回对象中包含 render 方法时被调用;该方法需要返回实现了 render 方法的响应对象
        1. process_template_response(self,request,response)
    3. 配置中间件,settings.py 中设置

      1. MINDDLEWARE=[ ,]

Djnago 分页


  1. 一 :相关概念与配置

    1. 导入包:from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
    2. 分页对象的构造方法:paginator=Paginator(object_list,per_page)
      1. onject_list 需要分页的数据对象列表哦
      2. per_page 每页数据个数
      3. 返回值 paginator 对象
    3. paginator 对象 的属性
      1. count: 需要分页数据的对象总数
      2. num_pages:分页后的页面总数
      3. page_range:从 1 开始的 range 对象,用于记录当前页码数
      4. per_rang:每页数据的个数
    4. paginator 对象 的方法
      1. page(number):返回指定页的对应页信息,如果页码不存在会抛出 invalidPage 异常, page 方法返回 page 对象
    5. page 对象方法
      1. has_next():如果有下一页返回 true
      2. has_previous():如果有上一页返回 true
      3. has_other_pages():如果有上一页或者下一页返回 true
      4. next_page_number():返回下一页的页码,如果不存在抛出 invalidPage 异常
      5. previous_page_number():返回上一页的页码,如果不存在抛出 invalidPage 异常
    6. page 对象属性:
      1. object_list:当前页上所有数据对象的列表
      2. number:当前页的序号,从 1 开始
      3. paginator:当前 page 对象相关的 Paginator 对象

Djnago csv 文件


生成 csv 文件

  1. 相关概念:

    1. csv(Comma-Separated Values):逗号分隔值文件,用于存储表格数据.
  2. 使用步骤案例:

import csv

"""
@param: CSVDemo1.csv 创建的csv文件名.
@param: w  以write(可写)方式进行IO流操作
@param: newline=""  方法默认参数,必须存在

"""

# with关键字封装了try catch操作:减少了步骤
with open('CSVDemo1.csv', "w", newline="") as csvfile:
    # 创建writer对象.
    writer = csv.writer(csvfile)
    # 通过writer对象写入行
    writer.writerow(['a', 'b', 'c'])
    writer.writerow(['d', 'e'])
    writer.writerow(['f'])

下载 csv 文件

  1. 请求体的 Content-Type 类型需修改为 text/csv
  2. 请求头里加入 Content-Disposition=attachment;filename=‘mybook.csv’ 属性.
  3. 创建 writer 对象,并将数据写入到 response 里面
  4. writer 对象调用 writerow 方法写入数据行.
  5. 返回 response 对象
def make_csv_view(request):
    response = HttpResponse(content_type="text/csv")
    response['Content-Disposition'] = 'attachment;filename="mybook.csv"'
    all_book = Book.objects.all()
    writer = csv.writer(response)
    writer.writerow(['书名', '作者'])
    for i in all_book:
        writer.writerow([i.title, i.info])
    # 直接返回response.
    print(response)
    return response


Djnago 内建用户表


利用内建用户表创建用户

  1. 创建普通用户
    1. from django.contrib,auth.models import User
    2. user=User.objects.create_user(username=‘用户名’,password=‘密码’,email=‘邮箱’)
  2. 创建超级用户
    1. from django,contrib.auth.models import User
    2. user=User.objects.create_superuser(username=‘用户名’,password=‘密码’,email=‘邮箱’)

扩展内建用户表(增加用户内建表的字段)

  1. 方案一:

    1. 通过建立子表,跟内建表做一对一映射.(给新字段添加唯一约束和外键约束,然后关联附表主键字段)
  2. 方案二:

    1. 继承内建的抽象 user 模型类 1.
      1. 添加新的 django App.
      2. 定义模型类继承 AbstrcctUser
      3. setting.py 中指明 AUTH_USER_MODEL=‘新应用名.类名’
      4. notice:此操作必须要在项目(不是 app)第一次 migrate 之前执行.(即还未初始化,auth_user 表还未在数据库创建时.)
class UserInfo(AbstrcctUser):
   pthon=models.CharField(max_length=11,default='')

校验用户密码

  1. 导包:from django,contrib.auth import authenticate
  2. 验证密码:user = authenticate(username=‘username’ password = ‘password’)
  3. 当用户名与密码校验成功后会返回一个对应的 user 对象,否则返回一个 None 值

修改用户密码

  1. 导包:from djang.contrib.auth.models import User
  2. 获取指定用户名的 user 对象:user=User.objects.get(username=‘username’)
  3. 重新设置用户密码:user.set_password(“new_password”)
  4. 提交:user.save()
from djang.contrib.auth.models import User

try:
   user=User.objects.get(username='username')
   user.set_password("new_password")
   user.save()
   return HttpResponse("修改密码成功!")
except:
   return HttpResponse("修改密码失败!")

保持登录状态(只能存储 session,时间不可控)

from django.contrib.auth import login

def login_view(request):
   #获取用户输入对象,并校验密码.
   user=authenticate(username='username',password='password')
   #将user对象存入session
   login(request,user)

登录状态校验

from django.contrib.auth.decorators import login_required

@login_required
def index_view(request):
   #该视图必须为用户登录状态下才可以访问,如未登录会自动跳转到指定网址:setting.py下的LOGIN_URL="/指定网站"
   #当前登录用户可通过request.user获取
   login_user=request.user

登录状态取消

from django.contrib.auth import logout

def logout_view(request):
   logout(request)


Djnago 上传文件


  1. 规范:表单<form>中文件上传时,必须携带 enctype='multipart/form-data’时才会包含文件内容数据

  2. 表单中用<input type=‘file’ name=‘xxx’>标签上传文件

  3. 在项目里创建一个文件夹,命名为 media

  4. setting.py 里配置 MEDIA_URL=‘/media/’

  5. setting.py 里配置 MEDIA_ROOT=os.path.join(BASE_DIR,‘media’)

  6. 在主路由内绑定 MEDIA_URL 和 MEDIA_ROOT.

    from django.conf import settings
    from django.conf.urls.static import static
    
    urlpatterns+=static(settings.MEDIA_URL,decument_root=settings.MEDIA_ROOT)
    
    
    

文件上传函数:

  1. 传统方式:

    @csrf_exempt
    def upload_view(request):
       if request.method=="GET":
          return render(request,"test_upload.html")
    
       elif request.method=='POST':
          a_file=request.FILES['myfile']
          print('文件上传名是:'a_file.name)
          filename=os.path.join(settings.MEDIA_ROOT,a_file.name)
          with open(filename,'wb') as f:
             data=a_file.file.read()
             f.write(data)
          return HTTPResponse('接收文件'+a_file.name+"成功")
    
    
    
  2. 借助 ORM 字段.
    在创建表的时候,添加 FileField(upload=‘子目录名’)

    @csrf_exempt
    def upload_view_dj(request):
        if request.method=="GET":
          return render(request,"test_upload.html")
       elif request.method=='POST':
          title=request.POST['title']
          a_file=request.FiLES['myfile']
          Content.objects.create(desc=title,myfile=a_file)
          return HttpResponde('---upload is ok')
    
    

Djnago 发送邮件


  1. 在 setting.py 中配置发送邮件:

    
    # 配置Django邮箱
    EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
    EMAIL_HOST = "smtp.qq.com"  # qq邮箱的SMTP服务器地址
    EMAIL_PORT = 25  # SMTP的端口号
    EMAIL_HOST_USER = '2212889205@qq.com'  # 发送邮件的qq邮箱
    EMAIL_HOST_PASSWORD = "kupinuekfsgvebfd"  # POP3/IMAP内的授权码
    EMAIL_USE_TLS = False  # 进行SMTP服务通信时,是否启动TLS安全连接.默认False
    
    
    
  2. 调用发送函数:

    from django.core import  mail
    #from_emil:发件人
    #recipient_list:收件人
    mail.send_mail(subject='测试邮件',message='hello django emil',from_emil='2212889205@qq.com',recipient_list=['189915245@qq.com'])
    
    
    

Djnago uwsgi 项目部署


  1. 配置好服务器所需运行环境.
  2. 将项目迁移到服务器
  3. 使用 uWDGI 替换 python manage.py runserver
  4. 配置 nginx 反向代理服务器,来平衡分配用户访问呢的服务器,防止服务器过载

WSGI

  1. 概念:
    1. WSGI(Web Server GateWay Interface)web 服务器网关接口,是 python 应用程序或框架和 web 服务器之间的一种接口,被广泛使用.
    2. python manage.py runserver 通常只在开发和测试环境中使用.当开发结束后,完整的项目代码需要在一个稳定高效的环境中运行时就需要用 WSGI.

uWSGI

  1. 概念:uWSGI 是 WSGI 的一种,它实现类的 http 协议以及 uwsgi 协议,uWSGI 功能完善.支持协议多.在 python web 中使用广泛.

  2. 安装 uWSGI

    1. uWSGi,需要在 Ubuntu(乌班图)或 linux 中安装.

    2. linux 安装虚拟环境:

      1. mkvirtualenv tt // 创建名为 tt 的虚拟环境
      2. workon tt // 进入这个虚拟环境
    3. 安装指令:pip install uwsgi -i https://mirrors.aliyun.com/pypi/simple/
      // 使用镜像源进行安装

    4. 检查是否安装成功:

      1. sudo pip3 freeze|grep -i ‘uwsgi’
      2. 安装成功会输出 uWSGI==2.0.18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值