一 首先掌握HTTP协议

  HTTP四大特性:

    1 基于tcp/IP作用在应用层之上的协议

    2 基于请求响应

    3 无状态(不识别来的用户的状态)

    4 无连接(请求完返回响应后就断开)

  数据格式:

    请求 :

      请求首行 GET  url HTTP/1.1

      请求头(一大堆键值对)

      空格(\r\n)

      请求体

    响应:

      同上

  响应状态码

    1xx  :服务器已经收到了你的数据正在处理,你可以继续提交数据

    2xx:   请求成功 ,返回响应的数据

    3xx :重定向

    4xx: 请求不存在(404)

    5xx:服务器错误

    如何推导Django

借助wsgiref模块帮我处理socket以及http消息的处理

返回一个字符串

返回一个HTML页面

返回HTML页面展示当前时间(HTML文件r模式打开就是一堆字符串,利用字符串替换

完成后端向前端HTML的数据传送)

借助jinja2 帮我们完成模板渲染(后端给HTML页面传输数据)render()

模板语法

{{}}两个大括号 显示变量相关

{%%} 表示逻辑相关 for循环

{{data}}

{{data.name}}  从后端拿到数据

{%for user_dict in user_list%}

   {{}user_dict}

{%endfor%}

pymysql 连接数据库
 动静态网页
  静态网页:数据时写死的,万年不变
  动态网页:数据是后台动态获取的,比如数据库的数据

python三大主流web框架

Django   (大而全)

flask (小而精)

tronado (异步非阻塞)

Django安装

一:命令行安装

命令行安装

pip install   dijango==1.11.11

命令行创建Django项目

django-admin startproject  “项目名”

这样创建的Django项目只有一个

一个项目文件夹

__init__

settings

urls

wsgi

manage.pycharm安装

命令行创建APP应用

python manage.py  startapp  应用名(app01)

命令行启动Django项目

python manage.py runserver

命令行关闭Django项目

crtl+c

二 种方式安装

pycharm安装

new project 选Django  注意选择你的解释器(本机)可以直接写APP名帮你自动创建一个APP)

应用下

migrations   数据库记录相关

models.py   数据库模型表(orm)

views.py   视图函数(执行相关功能的)

项目名下

__init__.py

settings.py  项目配置文件

urls.py   路由与视图函数

wsgi.py  wsgiref相关

manage.py    项目入口文件

必会用的三大功能模块

HttpResponse  回字符串

render  渲染页面并返回

redirect  从定向(可以写别人的网址也可以写自己的路由)

from  django.shortcuts  import render ,HttpRespose ,redirect

Django中APP的概念:相当于一所大学中的学院

  1. 前端页面两种引入外部资源的方式
    CDN 内容分发网络
    加载本地文件
  2.  
  3. html文件夹约定俗成的放在templates文件夹下
    TEMPLATES = [
    {
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [os.path.join(BASE_DIR, 'templates')]
    ,
    'APP_DIRS': True,
    'OPTIONS': {
    'context_processors': [
    'django.template.context_processors.debug',
    'django.template.context_processors.request',
    'django.contrib.auth.context_processors.auth',
    'django.contrib.messages.context_processors.messages',
    ],
    },
    },
    ]
  1. 约定俗成的静态文件都在放在static文件夹下
    一般情况下static文件夹下建议分成css,js及其他相关文件夹实现分层
    django静态文件配置
    STATIC_URL = '/static/'
    # 静态文件路径配置
    STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static'),
    os.path.join(BASE_DIR,'static1'),
    os.path.join(BASE_DIR,'static2'),
    ]
  2.  
  3. form表单两种提交方式
    一种是input type=submit
    一种是button按钮
  4.  
  5. form表单默认是get请求
    参数携带方式
    http://127.0.0.1:8000/login/?username=jason&password=123
    可以通过method参数指定提交方式
  6.  
  7. action三种指定数据提交路径的方式(******)
    1.全路径 :http://127.0.0.1:8000/login/
    2.后缀:/login/(推荐用这种)
    3.不写:不写默认往当前路径提交
  8.  
  9. 通常情况下视图函数处理的都是get请求
    def login(request):
    # print('收到了')
    # print(request.method)
    if request.method == 'POST':
    # 专门写post请求所对应的逻辑
    return HttpResponse('收到了!')
    # 直接写所有get请求所对应的逻辑
    return render(request, 'login.html')
  10.  
  11. get请求和post请求
  12.  
  13. django获取前端请求方式
    request.method
  14.  
  15. 获取get请求提交的数据
    request.GET 携带了前端所有get请求的数据
    username = request.GET.get('username')
    password = request.GET.get('password')
    取值遵循字典取值 注意虽然它的value是列表但是你取的时候默认取列表最后一个元素
  16.  
  17. 如果想获取列表里面所有的参数需要用
    getlist() 重点******* 应用场景 checkbox 多选的select
  18.  
  19. 获取post请求提交的数据
    request.POST 携带了前端所有get请求的数据
    username = request.POST.get('username')
    password = request.POST.get('password')
    取值遵循字典取值 注意虽然它的value是列表但是你取的时候默认取列表最后一个元素
  20.  
  21. 如果想获取列表里面所有的参数需要用
    getlist() 重点******* 应用场景 checkbox 多选的select
  22.  
  23. ORM
    什么是ORM
    对象关系映射:
    一个类 >>> 数据库的一张表
    类的对象 >>> 数据库的一条记录
    对象点数据(user_obj.name) >>> 数据库某条记录的某个字段值
    优点:
    不会写sql的程序员也能很溜的操作数据库
    大大提高了开发效率
  24.  
  25. 缺点:
    可能sql语句执行效率不高
  26.  
  27. django连接mysql数据库
    1.配置文件注意点:变量名必须全部是大写,否则无效
    DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'test007',
    'USER':'root',
    'PASSWORD':'123321',
    'HOST':'127.0.0.1',
    'PORT':3306
    }
    }
    2.使用django orm它不会自动帮你创建库,需要你手动创建
    能帮你自动干的事:
    自动帮你创建表
  28.  
  29. **********数据库迁移命令******************
    python manage.py makemigrations 这一句命令只是记录一下数据库更改记录
    python manage.py migrate 真正去操作数据库
  30.  
  31. orm查询user表所有数据
    models.User.objects.all()
    orm查询user表的某条数据
    user_queryset = models.User.objects.filter(name=username,password=password)
    只有queryset对象才能够点query获取当前queryset对象所对应的sql语句
    user_obj.query
    # SELECT
    # `app01_user`.`id`,
    # `app01_user`.`name`,
    # `app01_user`.`password`
    # FROM
    # `app01_user`
    # WHERE
    # ( `app01_user`.`name` = jason AND `app01_user`.`password` = 123 )
  32.  
  33. 如果想获取对应的模型表对象,需要通过"索引取值"的方式,回去真正的数据对象
    queryset支持正数索引取值,但是不推荐你直接用索引,推荐你用orm给你封装的first()
    user_obj = models.User.objects.filter(name=username,password=password).first()
    只有取出真正的模板表对象,才能通过点的方式操作对应数据库的某条数据
  34.  
  35. 表字段的增删改
    ******
    只要动了models.py中涉及表的代码,就必须重新执行数据库迁移命令
    缺一不可,切顺序不可颠倒
    python manage.py makemigrations 这一句命令只是记录一下数据库更改记录
    python manage.py migrate 真正去操作数据库
  36.  
  37. 表字段的新增
    # 对于已经有数据的表,新增字段的时候,要设置默认值
    addr = models.CharField(max_length=32,default='China')
    # 或者指定该字段可以为空
    phone = models.CharField(max_length=32,null=True)
  38.  
  39. user表数据的增删改查
    查:
    后端
    def userlist(request):
    # 查询user表所有数据
    user_queryset = models.User.objects.all()
    return render(request,'userlist.html',{'user_list':user_queryset}) # 前端可以通过user_list拿到对应的数据
    前端
    # 模板语法之for循环 循环展示数据 可以直接敲for tab键自动补全for循环语法
    {% for user_obj in user_list %}
    <tr>
    <td>{{ user_obj.id }}</td>
    <td>{{ user_obj.name }}</td>
    <td>{{ user_obj.password }}</td>
    <td>{{ user_obj.addr }}</td>
    <td class="text-center">
    <a href="/edit_user/?id={{ user_obj.pk }}" class="btn btn-primary btn-sm">编辑</a>
    <a href="/delete_user/?id={{ user_obj.id }}" class="btn btn-danger btn-sm">删除</a>
    </td>
    </tr>
    {% endfor %}
    删:
    def delete_user(request):
    # 获取被删除对象的id
    delete_id = request.GET.get('id')
    # queryset自带delete方法,删除queryset里面所有的数据对象
    # queryset调delete()执行的批量操作 删除的是queryset里面所有的数据
    affect_rows = models.User.objects.filter(id=delete_id).delete()
    print(affect_rows)
    return redirect('/userlist')
    前端
    <a href="/delete_user/?id={{ user_obj.id }}" class="btn btn-danger btn-sm">删除</a>
    增:
    # 方式1:新增数据操作 返回值就是当前被创建对象本身
    # user_obj = models.User.objects.create(name=username,password=password,addr=addr)
    # 方式2:
    # user_obj = models.User(**request.POST)
    # user_obj.save()
    改:
    思路:先获取到底改哪条数据 查询该数据 渲染到前端页面供用户查看及修改
    post请求中获取被修改对象的id两种方式:
    1.input隐藏标签
    2.action携带参数
    <form action="/edit_user/?id={{ edit_obj.pk }}" method="post">
    <input type="hidden" value="{{ edit_obj.pk }}" name="id">
    <p>username:<input type="text" name="username" class="form-control" value="{{ edit_obj.name }}"></p>
    <p>password:<input type="password" name="password" class="form-control" value="{{ edit_obj.password }}"></p>
    <p>addr:<input type="text" name="addr" class="form-control" value="{{ edit_obj.addr }}"></p>
    <input type="submit" class="btn btn-success">
    </form>
    两种修改数据的方式:
    # 修改数据方式1
    models.User.objects.filter(id=id2).update(name=username,password=password,addr=addr)
    # 修改数据方式2
    edit_obj = models.User.objects.filter(id=id2).first()
    edit_obj.name = username
    edit_obj.password = password
    edit_obj.addr = addr
    edit_obj.save()
    只要是queryset对象就可以连续调用queryset对象对应的方法
    models.User.objects.filter().filter().filter().filter().filter()
  40.  
  41. 查询数据的两种方式
    models.User.objects.filter() 拿到的是queryset对象
    edit_obj = models.User.objects.get(id=edit_id) 拿到的就是数据对象本身(不推荐使用)
  42.  
  43. django请求生命周期
  44.  
  45. 图书管理系统表设计
  46.  
  47. 书籍 >>> 出版社 一对多(注意:外键说法描述只有一对多,没有多对一)
    作者 >>> 书籍 多对多
    出版社
  48.  
  49. 一对多
    publish = models.ForeignKey(to='Publish') # 关联publish表 关联字段默认就是主键id
  50.  
  51. 图书管理系统表相关
    class Book(models.Model):
    # id不写 默认自动就有 指定的话就用你指定的
    name = models.CharField(max_length=32)
    # 小数最多8位 小数部分占两位 999999.99
    price = models.DecimalField(max_digits=8,decimal_places=2)
    # 书籍与出版社是一对多关系 外键字段建在多的一方 orm会自动给这个字段加_id >>>publish_id
    publish = models.ForeignKey(to='Publish') # 关联publish表 关联字段默认就是主键id
    # 多对多外键字段 建议放在使用频率比较高的那张表里 为后期orm查询提供便利
    authors = models.ManyToManyField(to='Author') # 自动帮你创建书籍与作者的关系表 不会在当前表里面创建字段
  52.  
  53. class Publish(models.Model):
    name = models.CharField(max_length=32)
    email = models.EmailField()
    addr = models.CharField(max_length=32)
  54.  
  55. class Author(models.Model):
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=32)

djjango安装及其 操作命令的更多相关文章

  1. CentOS 7 之 Docker 安装及操作命令

    Docker 安装 官方网站上有各种环境下的安装指南,比如:CentOS.Ubuntu 和 Debian 系列的安装. 而我们现在主要介绍的是基于 CentOS 7.x 上面的安装. 1.查看是否已经 ...

  2. Docker安装redis操作命令

    最近学习了redis,那么今天我们来学习以下在Docker上安装我们的redis,并查看有关redis的一系列命令 查找redis docker search redis 拉取redis docker ...

  3. Docker入门 安装 基础操作命令

    Docker 学习来源 https://www.bilibili.com/video/av26993050/?spm_id_from=333.788.b_636f6d6d656e74.20 https ...

  4. centos6.7下编译安装lnmp

    很多步骤不说明了,请参照本人的centos6.7下编译安装lamp,这次的架构是nginx+php-fpm一台服务器,mysql一台服务器 (1)首先编译安装nginx: 操作命令: yum -y g ...

  5. Python编程软件的安装与使用——Windows、Linux和Mac

    Python版本:3.6.2  操作系统:Windows  作者:SmallWZQ 最近,有读者透露:Python软件如何安装?为什么自己安装的软件会有各种"奇怪"的问题?据此,本 ...

  6. elk日志分析平台安装

    ELK安装 前言 什么是ELK? 通俗来讲,ELK是由Elasticsearch.Logstash.Kibana 三个开源软件的组成的一个组合体,这三个软件当中,每个软件用于完成不同的功能,ELK 又 ...

  7. 安装python第三方包

    20190822 先说一下,有4种方法(我知道的): 1.源码安装 2.python自带包管理器安装 3.外部包管理器安装 4.whl格式安装 1.源码安装 Python第三方库几乎都可以在githu ...

  8. nmap 扫描信息收集

    1.端口镜像 port Mirroring 功能通过在交换机上或者路由器上,将一个或者多个源端口的数据流量妆发大奥某一个指定的端口来实现对网络的监听,指定端口成为镜像端口或目的端口. 2.ARP攻击捕 ...

  9. ELK服务基础

    官方文档 什么是ELK? 通俗来讲,ELK是由Elasticsearch.Logstash.Kibana三个开源软件组成的一个组合体,这三个软件当中,每个软件用于完成不同的功能,ELK又称为ELK s ...

随机推荐

  1. OracleSql语句学习(二)

    --DQL语句--查询语句用来检查数据使用--SELECT子句用来指定要查询的字段,若写“*”则表示查询所有字段.FROM子句用来指定数据来源的表.--SELECT * FROM emp_weiyij ...

  2. 工具(3): 转换Excel表格到MarkDown:exceltk

    源码和下载: 0.1.3 mac: https://github.com/fanfeilong/exceltk/blob/master/pub/exceltk.0.1.3.pkg windows: h ...

  3. 4月11日java多线程4

    继昨天学习了线程池之后,今天学习了多线程内的锁Lock. 定义方法: ReentrantLock queueLock = new ReentrantLock(); //可重入锁 ReentrantRe ...

  4. mysql的时区错误问题: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one

    问题:The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone.. ...

  5. A Java Runtime Environment (JRE) or Java Development Kit (JDK) must be available in order to run Eclipse.

    cp -r /home/cuthead/android-studio/jre /home/cuthead/adt-bundle-linux-x86_64-20131030/eclipse/jre 使用 ...

  6. Linux下C语言生成可执行文件的过程

    在当前目录下创建一个C源文件并打开: touch test.c gedit test.c直接编译: gcc test.c -o test 分步骤编译: 1) 预处理    gcc -E test.c  ...

  7. SPOJ-LCS Longest Common Substring 【后缀自动机】

    题目分析: 用没出现过的字符搞拼接.搞出right树,找right集合的最小和最大.如果最小和最大分居两侧可以更新答案. 代码: #include<bits/stdc++.h> using ...

  8. 【ARC101F】Robots and Exits 树状数组

    题目大意 有 \(n\) 个机器人和 \(m\) 个出口. 这 \(n\) 个机器人的初始位置是 \(a_1,a_2,\ldots,a_n\),这 \(m\) 个出口的位置是 \(b_1,b_2,\l ...

  9. 七牛Qshell 常用命令打印

    下载 该工具使用Go语言编写而成,当然为了方便不熟悉Go或者急于使用工具来解决问题的开发者,我们提供了预先编译好的各主流操作系统平台的二进制文件供大家下载使用,由于平台的多样性,我们把这些二进制打包放 ...

  10. 【bfs】麻将游戏

    题目 来自:yinzm的blog 在一种"麻将"游戏中,游戏是在一个有W*H格子的矩形平板上进行的.每个格子可以放置一个麻将牌,也可以不放(如图所示).玩家的目标是将平板上的所有可 ...