Django框架入门

Posted gredae

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)  # 也是创建一条记录
  • 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()

以上是关于Django框架入门的主要内容,如果未能解决你的问题,请参考以下文章

Python web 框架 - Django入门

web框架之--Django基础入门

Django入门

Python必学Django框架,入门到精通学习视频教程全都在这可以领

Python云端系统开发入门——云端系统之框架基础

[Python] Django框架入门