Python学习笔记Day18 - Django


目录
  • 快速开发组件
    • BootStrap (***最精美,模板多nifty)
    • jQueryUI (*略推荐)
    • EasyUI
  • WEB框架
  • Django
    • 1. 创建Django工程
    • 2. 运行Django功能
    • 3. 创建app文件夹
    • 4. 配置模板的路径
    • 5. 创建并配置静态目录
    • 6. 跨站请求伪造csrf禁用 (正式项目不需此步,但要在html中声明csrf_token)
    • 7. 定义路由规则url
    • 8. 定义视图函数views
    • 9. 模板渲染
  • 作业
  • 博客
  • 问题
    • 1. table文字不换行
    • 2. 设置STATIC_URL, STATICFILES_DIRS, STATIC_ROOT的区别
    • 3. 在Django中完整地删除一个App
    • 4. 修改完数据后可直接用redirect刷新页面(属于get方式),比用render再传一次参数要方便
    • 组合搜索

快速开发组件

BootStrap (***最精美,模板多nifty)

- css
- js

学习 BootStrap 规则

一、响应式
    @media (min-width:900px){
        .c2{}
    }

二、图标、字体
    @font-face 指定图标字体文件
    使用时使用代号

三、基本使用
    导入js
    导入bootstrap
    css:{
        color:red !important;       #加!important表示不管先后顺序,一定会应用
    }
    bxslider轮播图,引用它的css和js,

========> 偏于后台管理

jQueryUI (*略推荐)

- css
- js

学习 jQueryUI 规则

EasyUI

- css
- js

在官网下easyUI包,查demo,复制源码,更改css,js链接
easyUI的源码和html代码不一致,不方便修改,不推荐

WEB框架

本质是socket

MVC:对文件夹分类
    Model     View       Controller
    数据库   模板文件    业务处理(函数)

MTV:
    Model    Template     View
    数据库   模板文件    业务处理

MVC、MTV,只是文件夹命名不同

Django

==用python开发web最齐全的框架=

基于MTV框架

http://www.cnblogs.com/wupeiqi/articles/5237704.html

1. 创建Django工程

  • 执行终端命令

      django-admin startproject 【工程名称】
    

    也可从Pycharm等IDE创建,不用重复此步骤,本质上都是自动执行上述命令

  • 其他常用命令:

      python manage.py runserver 0.0.0.0
      python manage.py startapp appname
      python manage.py syncdb
      python manage.py makemigrations
      python manage.py migrate
      python manage.py createsuperuser
    
  • 程序目录:

      【工程文件夹】
          - 【同名子文件夹】        # 对整个程序进行配置
              - init
              - settings  # 配置文件
              - wsgi      # 遵循WSIG规范,创建socket,uwsgi + nginx
              - url       # URL对应关系
                      def hello(request):
                          return HttpResponse('
    hello
    ') urlpatterns = [ path('s1/',hello) ] - manage.py # 管理Django程序:ORM对象 - python manage.py - python manage.py startapp xx - python manage.py makemigrations - python manage.py migrate

2. 运行Django功能

python manage.py runserver 127.0.0.1:8001

3. 创建app文件夹

  • 配置文件夹

      cd 工程名
      python manage.py startapp xxxx....
    
  • app目录:

      migrations     数据修改表结构,每次表结构修改都会记录在一个文件中
      admin          Django为我们提供的后台管理功能(包括登录、权限管理、分组、搜索)
      apps           配置当前app
      models         ORM,写指定的类  通过命令可以创建数据库结构
      tests          单元测试
      views    ***   业务代码
    

4. 配置模板的路径

放置html,一般已自动创建        /./settings   
    TEMPLATES = [{
                'DIRS': [os.path.join(BASE_DIR, 'templates')],
            },]

5. 创建并配置静态目录

  • 创建/static,放置css,js,image等静态文件

      /./settings
      STATICFILES_DIRS = (
          os.path.join(BASE_DIR, 'static'),   # 不加逗号会报错
      )
    
  • 在html中导入css,js

      
    

6. 跨站请求伪造csrf禁用 (正式项目不需此步,但要在html中声明csrf_token)

/./settings
middlerware     # 注释 csrf

# 'django.middleware.csrf.CsrfViewMiddleware',

7. 定义路由规则url

/./url.py
1. 要在url里导入app 
2. path('home/',views.home),
    - url里可不加/,但要与引用处保持一致。
    - 建议加上,访问时没有则自动加/
  • Django生命周期:

      用户请求 ->> 路由 ->> 视图函数 ->> templates(html)、static(js,css)
                  url.py   app.views.py
    

8. 定义视图函数views

/app/views.py
    def func(request):
        request.method   GET / POST (大写)

    ========== GET 获取数据===========
        http://127.0.0.1:8009/home?nid=123&name=alex 
        request.GET.get('',None)   # 获取请求发来的数据,没有则返回none

    ========== POST 提交数据==========
        request.POST 包含用户提交的数据字典,以name字段为key
        request.POST.get('')

    ======== 返回数据 ========
        return HttpResponse('
hello
') # 直接返回字符串,可解析成页面 return render(request, "HTML模板的路径",{'形参': 实参}) # 获取html文件返回 return redirect('只能填URL') # 重定向 - 也可填本地url:'/home' 前面的/代表本地的url前缀

9. 模板渲染

  • Django中特殊的模板语言

  • {{ 变量名 }}

      视图函数返回数据时将{{}}替换为相应的值
      return render(request, "index.html", {
                  'current_user': "alex",
                  'user_list': ['alex','eric']
                  'user_dict': {'k1': 'v1', 'k2': 'v2'}
                  })
      
          
              
    {{current_user}}
  • For循环

      {% for row in user_list %}
              
  • {{ row }}
  • {% endfor %} - 获取key {% for row in k2.keys %} - 获取value {% for row in k2.values %} - 获取key和value {% for k,v in k2.items %} - for循环里获取当前循环次数 forloop.counter 索引,从 1 开始算 forloop.counter0 索引,从 0 开始算 forloop.revcounter 索引,从最大长度到 1 forloop.revcounter0 索引,从最大长度到 0 forloop.first 当遍历的元素为第一项时为真 forloop.last 当遍历的元素为最后一项时为真 forloop.parentloop.xxx 用在嵌套的 for 循环中,获取上层循环的 forloop
  • 用 "索引" 取列表(0)或字典(key)里的值

       {{ user_list.0 }} 
       {{ user_dict.k1 }} 
    
  • if条件判断

      {% if age %}
          有年龄
          {% if age > 16 %}
              老男人
          {% elif age < 3 %}
              ...
          {% else %}
              小鲜肉
          {% endif %}
      {% else %}
          无年龄
      {% endif %}
    
      ==, !=, >=, <=, >, < 
      and, or, not, in, not in 
      {%if value is None %}
    
  • 获取当前用户:

      {{ request.user }}
    
  • 如果登陆就显示内容,不登陆就不显示内容:

      {% if request.user.is_authenticated %}
          {{ request.user.username }},您好!
      {% else %}
          请登陆,这里放登陆链接
      {% endif %}
    
  • 获取当前网址:

      {{ request.path }}
    
  • 获取当前 GET 参数:

      {{ request.GET.urlencode }}     # keywords=131;time_filter=True
    
  • 获取referer

      request.META['HTTP_REFERER']
    

作业

XXXX管理:

SQLAlchemy

  • 主机管理表(8列):

      IP
      端口
      业务线
      ...
    
  • 用户表:

      用户名
      密码
    
  • 功能:

      1、登录
      2、主机管理页面
          - 查看所有的主机信息(4列)
          - 增加主机信息(8列) ** 模态对话框
      3、查看详细
          url:
              "detail" -> detail
    
          def detail(reqeust):
              nid = request.GET.get("nid")
              v = select * from tb where id = nid
              ...
      4、删除
          del_host -> delete_host
    
          def delete_host(request):
              nid = request.POST.get('nid')
              delete from tb where id = nid
              return redirect('/home')
    

博客

  • KindEditor

    • beautifulsoup4对标签进行过滤
    • 单例模式
  • 事务操作

    • from django.db import transaction
  • 筛选条件

    • 利用数据库内置函数实现筛选

作业:

- 示例
- 评论和点赞

pip3 install beautifulsoup4

问题

1. table文字不换行

- 给相应td添加 white-space:nowrap; 这个属性是设置文字强制不换行
- 或者在td内添加div标签,默认不换行

2. 设置STATIC_URL, STATICFILES_DIRS, STATIC_ROOT的区别

  • STATIC_URL='/static/'

    这个static 是在Django 具体APP下建立的static目录,用来存放静态资源。

  • STATIC_ROOT = os.path.join(BASE_DIR, 'collect_static') # BASE_DIR 是项目的绝对地址

    STATIC_ROOT 是在部署静态文件时(pyhtonmanage.pycollectstatic)所有的静态文静聚合的目录,STATIC_ROOT要写成绝对地址
    STATIC_ROOT 是在部署的时候才发挥作用,django会把所有的static文件都复制到STATIC_ROOT文件夹下

  • STATICFILES_DIRS=(os.path.join(BASE_DIR, "common_static"),) # 不加逗号会报错

    STATICFILES_DIRS 一般用来设置通用的静态资源,对应的目录不放在APP下,而是放在Project下,且非必须.
    STATICFILES_DIRS告诉django,首先到STATICFILES_DIRS里面寻找静态文件,其次再到各个app的static文件夹里面找
    (注意, django查找静态文件是惰性查找,查找到第一个,就停止查找了)

具体在模板文件中访问的时候,都是统一用:/static/资源名的方式,就可以访问到资源
不论具体的目录是APP下的static,还是project下的common_static, 都可以用/static/资源名的方式访问到。

为增强可移植性,在模板中可以用:STATIC_URL来代替具体的/static/来设置资源路径,但是需要在settings.py中2个地方进行设置,否则会发生取不到资源的错误:

INSTALLED_APPS 中,加入 'django.contrib.staticfiles'
TEMPLATES 中,context_processors中,加入django.template.context_processors.static

模板中调用时:


https://blog.csdn.net/jj546630576/article/details/78606531

3. 在Django中完整地删除一个App

  1. 删除models.py

    无论是删除一个单独的model还是删除整个App,都需要首先删除models.py文件中的模型。

    确认没有其他文件引用models.py中的类。

    迁移或者删除你的数据库,Django提供了简便的方法方便用户删除某App下的所有数据(Django 1.7)。

    python manage.py migrate app1 zero

    删除models.py中的数据模型。

  2. 删除App

    再次确认其他App中没有引用此App的文件

    删除整个App文件夹

    在settings.py的Installed Apps中移除该app。

4. 修改完数据后可直接用redirect刷新页面(属于get方式),比用render再传一次参数要方便

组合搜索

  1. 利用url传参给views里的kwargs,利用models.XX.filter筛选id

  2. 将当前kwargs传给模板,获取当前url,达成组合搜索

  3. 利用simpletag写小模板,将判断代码写在后台.py文件中