Python学习笔记Day18

快速开发组件

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

- css
- js

学习 BootStrap 规则

一、响应式
    @media (min-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('<div>hello</div>')
                      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

      <link rel="stylesheet" href="/static/commons.css" />
    

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('<div>hello</div>')   # 直接返回字符串,可解析成页面
        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'}
                  })
      <html>
          <body>
              <div>{{current_user}}</div>
          </body>
      </html>
    
  • For循环

      {% for row in user_list %}
              <li>{{ row }}</li>
      {% 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)里的值

      <a> {{ user_list.0 }} </a>
      <a> {{ user_dict.k1 }} </a>
    
  • if条件判断

      {% if age %}
          <a>有年龄</a>
          {% if age > 16 %}
              <a>老男人</a>
          {% elif age < 3 %}
              ...
          {% else %}
              <a>小鲜肉</a>
          {% endif %}
      {% else %}
          <a>无年龄</a>
      {% 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

模板中调用时:

<img src="{{STATIC_URL}}pic.jpg " />

https://blog.****.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文件中