• Django框架入门


    Django框架入门

    HTTP协议

    • 四大特性

      • 基于TCP/IP协议之上作用于应用层的协议
      • 基于请求响应
      • 无状态
      • 无连接
    • 请求响应的数据格式

      • 请求格式

        请求首行
        请求头
        
        
        请求体(在这个地方区分get请求与post请求;get请求无请求体)
        
      • 响应格式

        响应首行
        响应头
        
        
        响应体
        
    • 状态码:

      • 1XX:服务器已接收到请求正在处理,可以继续发送请求
      • 2XX:响应成功 例如:200
      • 3XX:一般为重定向 例如:304
      • 4XX:请求错误 常见的有: 403(不满足请求条件,拒绝访问),404(资源不存在)
      • 5XX:一般为服务器内部错误

    动静态页面

    并不是说页面“动”与“不动”的区别,而是页面与服务器有没有数据上的交互

    Django返回的三板斧

    1. HttpResponse:返回字符串
    2. render:请求转发
    3. redirect:重定向

    Django配置静态文件

    通常情况下会将静态文件(js、css、图片、字体等)存放在 /static 文件夹下

    settings.py 中添加STATICFILES_DIRS=[

    ​ os.path.join(BASE_DIR,'static')

    ]

    这个时候你的静态文件就配置好了

    在你的前端页面应用js或css的时候只要以 /static/ 开头就可以引用静态文件

    或者是使用模板语言的方法来动态解析:

    {% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">
    <script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script>
    

    都说Django是一个Web框架,那么我们就来剖析下Web框架为我们做了那些事情

    • 与浏览器进行交互

      import socket
      
      server = socket.socket()
      server.bind(('127.0.0.1', 8080))
      server.listen(5)
      while True:
          con, addr = server.accept()
          data = con.recv(1024)    # 接收客户端数据
          print(data.decode())    # 打印客户端数据
          con.send(b"HTTP/1.1 200 OK
      
      ")    # 按照HTTP协议的格式响应
          con.send(b"Hello World!")    # 响应内容
          con.close()
      
    • 将html代码发送给客户端

      import socket
      
      server = socket.socket()
      server.bind(('127.0.0.1', 8080))
      server.listen(5)
      while True:
          con, addr = server.accept()
          data = con.recv(1024)
          print(data.decode())
          con.send(b"HTTP/1.1 200 OK
      
      ")
          con.send(b"""
          <html>
              <head>
                  <title>Title</title>
              </head>
              <body>
                  <h1>Hello World!</h1>
              </body>
          </html>
          """)
          con.close()
      

    有以上的两个功能(接收浏览器发来的数据,给浏览器发送数据)就可以说是一个最简单的Web服务器,就是这么简单。

    安装django

    pip install django

    注意事项:
    1. 计算机名称不能有中文
    2. 项目名尽量不要有中文

    使用命令行创建Django项目

    • 创建Django项目:

      django-admin startproject 项目名
      
    • 启动Django项目:

      python manage.py runserver
      
    • 创建应用app:

      python manage.py startapp 应用名
      

    使用pycharm创建Django项目与使用命令行创建Django项目的区别

    1. 使用命令行创建Django项目不会帮你创建templates文件夹,不会替你配置templates文件夹的路径
    2. 使用命令行创建不会帮你注册app应用,虽然pycharm会帮你注册应用,但是只会在创建第一个应用时会帮你注册

    Django的post请求问题

    当我们通过post请求请求服务器资源时会被服务器拒绝报一个403的错误。

    这是因为Django的默认开启防止csrf(跨站点请求伪造)攻击

    解决办法:

    1. 将setting.py 文件中的MIDDLEWARE中的django.middleware.csrf.CsrfViewMiddleware语句注释掉

    2. from django.views.decorators.csrf import csrf_exempt
      
      #在处理函数上加装饰器,使本次请求忽略csrf校验
      @csrf_exempt
      def post(request):
           name=request.post['name']
           return HttpResponse('welcome!{}'.format(name))
      
    3. 可以在form表单中添加{% csrf_token %}随着表单的提交而一起提交

    通过request对象获取前端数据

    • 请求方式:method

      request.method   # 这个会返回GET或POST
      
    • 获取前端携带的数据

      • get请求

        data = request.GET
        
      • post请求

        data = request.POST
        

    Django连接本地数据库

    • 第一步:配置数据库

      DATABASES = {
          'default': {
              'ENGINE': 'django.db.backends.mysql',  # 指定数据库
              'NAME': 'lx',  # 使用的数据库
              'USER':'root',  # 用户名
              'PASSWORD':'root',  # 密码
              'HOST':'127.0.0.1',   # 地址
              'PORT':3306,  # 端口号
              'CHARSET':'utf8'  # 指定编码格式
          }
      }
      

      如果我们只是配置了下数据库的话那么我们的程序还是会报错-_-

    • 第二步:配置连接时使用的模块

      因为Django默认是使用MySQLdb来连接数据库,但是很不幸它不支持3.X的版本

      这个时候我们就要告诉Django使用pymysql来连接数据库使用

      这里有两种方法:

      • 第一种是在与项目名同名的文件夹里的 __init__.py 文件中添加两行语句

        import pymysql
        pymysql.install_as_MySQLdb()
        
      • 第二种方法与第一种方法一样,只不过是在app应用里面的 __init__.py 文件夹中加入上面的两句话

      • 其实还有第三种方法,你可以装一个mysqlclient模块来代替mysqldb

    Django的ORM简介

    orm对象关系映射
        类                   数据库的表
        
        对象                 表的记录
        
        对象获取属性           记录的某个字段对应的值
    
    优点与缺点
    • 优点:能够让一个不会数据库操作的人,也能够简单快捷去使用数据库
    • 缺点:由于封装程度太高,可能会导致程序的执行效率偏低,需要结合项目需求,手写sql语句
    注意事项:

    ​ django的orm不会自动帮你创建库,库需要你自己手动创建表会自动帮你创建

    ​ 你只需要书写符合django的orm语法的代码即可

    通过orm创建

    去应用下所在的models.py中书写类

    from django.db import models
    
    # Create your models here.
    class Userinfo(models.Model):
        # 设置id字段为userinfo表的主键,相当于SQL语句中的 id int primary key auto_increment
        id = models.AutoField(primary_key=True)  # 在django中你可以不指定主键字段django orm会自动给你当前表新建一个名为id的主键字段
        # 设置username字段  username varchar(64)  CharField必须要指定max_length参数
        username = models.CharField(max_length=64)  # 在django orm中没有char字段,但是django允许自定义char字段
        # 设置password字段  password int
        password = models.IntegerField()
    
    • 不会创建表,而是生成一个记录 ,将你当前的操作记录下来(记录到migrations文件夹)
    python manage.py makemigrations
    
    • 将你的orm语句真正的迁移到(同步)到数据库中

      python manage.py migrate
      

    注:只要你在models.py中修改了跟数据库相关的代码 你就 必须 重新开始执行上面两条命令

    数据库表字段的 增删改 都可以通过models中的类来修改数据表对应的字段

    ORM的简单运用——增删改查

    • from 应用名 import models
      user_list = models.类.objects.get(id=1)  # 但是这个方法如果没有查询到数据就会报错
      user_list = models.类.objects.filter(id=1) # 这个方法不会报错,如果是两个条件及以上条件间是以and连接
      user_list = models.类.objects.all()  # 获取数据表的全部数据
      
    • from 应用名 import models
      user_obj = models.类(id=0, username='gredae', password=123)
      user_obj.save()  # 保存到数据库中
      user_obj = models.类.objects.create(id=0, username='gredae',password=123)  # 也是创建一条记录
      # 如果需要插入一堆数据可以使用批量插入:bulk_create
      user_ls = []
      for i in range(1000):
          user_ls.append(models.User(name=i))   # 创建类对象,并添加到列表中
      models.User.objects.bulk_create(user_ls)   # 通过bulk_create批量插入数据
      
    • from 应用名 import models
      # 修改单条记录
      user_obj = models.类.objects.filter(id=1)
      user_obj.username = '戈达尔'
      user_obj.save()
      # 修改多条记录
      user_list = models.类.objects.filter(id__lt=5)
      row = user_obj.update(username='gredae')
      
    • from 应用名 import models
      # 删除单条语句
      user_obj = models.类.objects.filter(id=1)
      user_obj.delete()  # 会立即删除并且没有返回值
      # 删除多条语句
      user_list = models.类.objects.filter(id__lt=5)
      row = user_obj.delete()
      # 程序员必备技能
      models.objects.all().delete()
      
  • 相关阅读:
    iview的modal点击确定消失(自动关闭)问题,自定义modal页脚
    vue实现组件数据双向绑定
    vue中封装svg-icon组件并使用
    闭包的概念
    vue基本集
    websocket
    99multiplication table
    h5c3增加了哪些新特性
    防抖与节流函数
    网页性能优化小技巧
  • 原文地址:https://www.cnblogs.com/Gredae/p/11756181.html
Copyright © 2020-2023  润新知