Django框架

一、网页基础知识

  • web 框架

网络连接过程

  • 关系:
    • socket客户端
      • 浏览器完成
    • socket服务器端
      • 编写网页程序实现
  • HTTP
    • 无状态、短连接:通讯结束后即断开连接

服务器端的基本逻辑过程

import socket

sock=socket.socket()
sock.bind('127.0.0.1',8080)
sock.listen()

while True:
    conn,addr=sock.accept()
    data=conn.recv(8096)
    conn.send(b'123123') #服务器端返回的数据,一般返回的是HTML页面
    conn.close()

自己写网站:
a. socket服务端
b. 根据URL不同返回不同的内容

  1. 路由系统:URL->函数

c. 字符串返回给用户

  1. 模板引擎渲染:
    1. HTML充当模板(特殊字符)
    2. 自己创造任意数据
  2. 返回的内容本质是字节编码的字符串,一般encoding='utf-8'

web框架种类:

  • a,b,c
  • [第三方a],b,c -->(wsgiref)Django
  • [第三方a],b,[第三方c]

http请求知识

  • post和get的区别
    HTTP请求包格式


    image.png

    HTTP响应包格式


    image.png

    post和get的区别:
    • 共同点:都是HTTP中请求数据的方法
    • get请求的数据会附在URL之后,以?分割URL和传输数据,参数之间以&相连;
    • post把提交的数据则放置在HTTP包的包体中;
    • 所以,post方法比get方法相对安全些,但是post方法传输的数据在包体中以明文存在,存在一定的安全隐患,所以又有了HTTPS协议。
  • get 和 post是HTTP中请求数据的方法;application json 与form表单是HTTP中传输文件的类型,

  • 浏览器向服务器异步请求数据

    • 异步:异步,异嘛,不同的意思,这里也就是指不跟浏览器加载执行网页代码的步伐一致,也就是说在一个网页中需要用户操作来触发执行代码,而不是整个网页代码一次性执行完毕。(这里的用户操作是指在同一个网页下面请求代码执行渲染,而不是让浏览器直接跳转渲染另一个页面)
    • XMLHttpRequest(也就是networks下的XHR):基于XML的HTTP请求。是一个浏览器接口,使得Javascript可以进行HTTP(S)通信。自从浏览器提供有了XMLHTTPRequest这个接口之后,ajax操作就此诞生。
    • AJAX(Asynchronous JavaScript and XML,异步的JavaScript和XML):ajax就是基于浏览器提供的XMLHttpRequest对象来实现的。
    • XML(eXtensible Markup Language,可扩展标记语言):在浏览器中使用XMLHTTPRequest对象在服务器之间通信,传输的数据是使用XML的方式,但最终还是会被转换成json数据格式来被我们使用。

二、创建项目及项目配置

创建项目

  • manage管理工具的使用

  • Pycharm社区版创建Django项目教程

    pip install django
    django-admin startproject mysite
    cd mysite
    python manage.py runserver
    
  • 处理用户请求实现代码

     from django.shortcuts import HttpResponse,render,redirect
     def login(request):
         """
         处理用户请求,并返回内容
         :param request:用户请求相关的所用信息(对象)
         :return:
         """
         # 字符串
         return HttpResponse('')
         return HttpResponse('login.html')
         if request.method == 'GET':
             # 返回网页
             return render(request,'login.html',{msg:'123123'}) #前端页面的{{msg}}处显示页面传递过去的值
         else:
             #用户POST提交数据(请求体),标签属性method=POST
             u=request.POST.get('user') # 若key正确则返回值,否则返回none
             p=request.POST.get('pwd')
             if u=='root' and p=='123123':
                 # 登录成功
                 return redirect('https:www.baidu.com')
             else:
                 return render(request,'login.html')
    

文件目录结构

  • 文件目录结构


    Django-mulu.png
  • 前端页面默认路径:


    Django-templates.png

项目基本配置

  • 时区

    LANGUAGE_CODE = 'zh-hans'
    
    TIME_ZONE = 'Asia/Shanghai'
    
  • 数据库连接——MySQL

    DATABASES = {
      'default': {
          'ENGINE': 'django.db.backends.mysql',
          'NAME': 'bishe',
          'USER': "root",
          'PASSWORD': "123456",
          'HOST': "localhost",
      }
    }
    

三、数据库

数据库迁移

  • 数据库迁移

    python manage.py migrate
    python manage.py makemigrations
    python manage.py
    
    # 只对某个APP数据迁移
    python manage.py makemigrations 
    
    python manage.py migrate 
    

    完成某个工程下特定的apps的数据迁移,一定要注意Django不会自动注册新创建的APP,所以一定要自己在项目的配置文件setting.pyINSTALLED_APPS中完成APP的注册

    • migrate,负责对INSTALLED_APPS中的应用程序迁移。
    • makemigrations, 负责基于你的模型修改创建一个新的迁移
    • sqlmigrate, 展示迁移的sql语句
    • showmigrations,其中列出了项目的迁移及其状态。

数据库迁移会遇到的问题

  • 解决Django迁移无法生成表:No migrations to apply

数据库类别

sqlite

  • 在Pycharm社区版中查看sqlite数据库

  • Pycharm社区版解决django的sqlite3的“database is locked”

  • 解决Django的sqlite3的database is locked

数据库操作

  • TypeError: init() missing 1 required positional argument: 'on_delete' 解决办法
  • Django中get和filter的区别
  • Django数据库的数据转成Json返回
  • Django全局搜索,仅适用于MySQL

四、auth用户认证模块

  • Django中的auth模块(用户认证)

  • Django 自带认证功能auth模块和User对象的基本操作

  • 扩展Django自带的Auth认证模块

    • 扩展方法
      • 扩展AbstractBaseUser
        • 重写django user验证方式
      • OneToOneField扩展
        • OneToOneField扩展1
        • OneToOneField扩展2
        • OneToOneField和ForeignKey的区别详解
  • Django错误:django.db.utils.IntegrityError: (1048, "Column 'level' cannot be null")

五、admin后台管理系统

  1. 访问:/admin
  2. 创建超级管理员的账号和密码
python manage.py createsuperuser
  • fields和list_display的区别
  • Django报错:“Key ‘id‘ not found in ‘xxx‘. Choices are: xxx“
  • 使用SimpleUI美化页面
    • 安装教程
      • 命令行运行pip uninstall django-simpleui先卸载一下
      • 然后输入pip install -i https://pypi.tuna.tsinghua.edu.cn/simple django-simpleui重新安装
      • 在settings.py文件中把debug调成true, 把simpleui加到INSTALLED_APPS最上面。
    • 总体教程

六、前端有关问题

  • 前端页面默认路径:


    Django-templates.png
  • CSS

    • CSS 加载新方式
  • images

    • django+html无法显示图片
  • HTML

    • HTML for循环遍历两个变量
  • js

    • js:如何获取select选中的值
    • DJANGO传递参数到模板中的JAVASCRIPT
    • Object of type ‘Decimal‘ is not JSON serializable

七、插件使用

前端插件

  • bootstrap3插件
    pip install django-bootstrap3
    

八、前后端数据交互

json数据

json.dumps() : 将Python的字典结构导出到json使用;
json.loads() : 将json读成Python的字典结构;
json.dump()json.load(): 不是针对字符串的,而是针对文件的;
Python JSON:编码(转储),解码(加载)json数据和文件(示例)

不是JSON可序列化的(is not JSON serializable)

  • 原因分析:
    • simplejson和json不能很好地与django对象一起使用。
    • Django的内置序列化程序只能序列化充满django对象的查询集,但不能包含混合的不同类型的迭代对象,比如在一个列表中有AttractionHotel两个类型的对象
      • 解决办法:给model中定义的类提供一个序列化(编码、转储的方法)http://www.voidcn.com/article/p-oadxzxnv-byw.html

        • 转储将像其他所有JSON可序列化对象一样,以递归方式调用序列化方法.也就是说,obj.parent也会被序列化,而不需要你做任何进一步的操作.

          class MyObject:
              #    ...
              #    MyObject has 3 properties: name (a string), number (an int), and parent (a MyObject)
              @staticmethod
              def serialize(obj):
                  return {
                      "name":   obj.name,
                      "number": obj.number,
                      "parent": obj.parent
                  }
          
              #    ...
          
          simplejson.dumps(myObjInstance, default=MyObject.serialize)
          
          • 扩展:分支选择序列化
        • 如果您只想将实例变量名称映射到它们各自的值,则可以使用一些内置的Python魔术.无论何时想要序列化更复杂的对象(同样,只使用1-1变量值映射),只需调用以下行:

          simplejson.dumps(anyObj, default=lambda obj: obj.__dict__)
          

序列化

  • 序列化Django对象

九、常见报错

  • Django报错解决:RuntimeError: Model class ...apps... doesn't declare an explicit app_label and isn't in

  • 运行django项目是报No module named 'rest_framework'错误

你可能感兴趣的:(Django框架)