zoukankan      html  css  js  c++  java
  • web框架之Django

    web框架之Django

    Django的优点和缺点

    优点:大而全自带的功能特别特别多 类似于航空母舰

    缺点:有时候过于笨重

    命令行使用

    1.创建django项目

    django-admin startproject mysite

    2.启动django项目

    python manage.py runserver

    3.创建应用app

    python manage.py stratapp app01

    注意

    1.新创建的app需要你去settings配置文件中注册
    pycharm只会帮你注册第一个你在创建项目的时候写的应用

    注意

    1. 使用命令行创建django项目 不会自动帮你创建templates文件夹只能自己创建
    2. settings文件中 需要你手动在TEMPLATES写配置
      os.path.join(BASE_DIR, 'templates')

    小白必会三板斧

    from django.shortcuts import render,HttpResponse,redirect

    HttpResponse #返回字符串

    render #返回HTML页面

    redirect #重定向

    静态文件配置

    静态文件

    1. 网站所用到的
      1. 自己写好的js
      2. 自己写好的css
      3. 第三方的框架 bootstrap fontwesome sweetalert

    通常情况下 网站所用到的静态文件资源 统一都放在static文件夹下
    STATIC_URL = '/static/' # 是访问静态资源的接口前缀
    """只要你想访问静态资源 你就必须以static开头"""
    手动配置静态文件访问资源

    STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static'),
    os.path.join(BASE_DIR,'static1'),
    os.path.join(BASE_DIR,'static2'),
      ]
    
    接口前缀 动态解析
    {% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">
    <script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script>
    

    form表单

    form表单 action参数可以写的形式
        1.不写 默认朝当前地址提交
        2.只写后缀/index/
        3.写全路径
           
    form表单默认朝后端提交的方式 默认是get请求
    get请求携带参数的方式 是在url后面?
     url?username=admin&password=213213213213213
     缺点
     1.不安全
     2.get请求携带的参数有大小限制(最大不能超过4KB左右)
        
    前期你如果要提交post请求 你就去settings.py文件注释掉一个中间件
    MIDDLEWARE = [
                'django.middleware.security.SecurityMiddleware',
              'django.contrib.sessions.middleware.SessionMiddleware',
                'django.middleware.common.CommonMiddleware',
                # 'django.middleware.csrf.CsrfViewMiddleware',
                'django.contrib.auth.middleware.AuthenticationMiddleware',
                'django.contrib.messages.middleware.MessageMiddleware',
                'django.middleware.clickjacking.XFrameOptionsMiddleware',
            ]
    

    request对象及方法

    前后端数据交互

    获取post请求携带的数据

    request.POST

    获取get请求携带的数据

    request.GET

    get和post在后端获取用户数据的时候规律是一样的

    <QueryDict: {'username': ['admin', 'tank'], 'password': ['123']}>
    tank <class 'str'>
    123 <class 'str'>

    注意:

    request.POST.get('username')默认只取最后一个元素

    如果想将列表完整取出必须用getlist()

    Django链接数据库

    django连接MySQL

    1.配置文件中配置

    DATABASES = {
    	default': {
        'ENGINE': 'django.db.backends.mysql',  #数据库 MySQL postgreSQL
        'NAME': 'day56',  # 到底使用哪个库
        'USER':'root',
        'PASSWORD':'root',
        'HOST':'127.0.0.1', 
        'PORT':3306,
        'CHARSET':'utf8'
                        }
                    }
    

    注意:

    django默认使用的是mysqldb连接数据库 但是该模块不支持了
    所以你要告诉django不要用mysqldb该用pymysql连接

    你可以在项目名下面的__init__.py也可以在应用名下面的__init__.py文件中指定
    import pymysql
     pymysql.install_as_MySQLdb()
    

    django orm简介

    orm对象关系映射
    
    类                   数据库的表
    
    对象                  表的记录
    
    对象获取属性          记录的某个字段对应的值
    
    优点:能够让一个不会数据库操作的人 也能够简单快捷去使用数据库
    
    缺点:由于封装程度太高 可能会导致程序的执行效率偏低
    有时候 结合项目需求 可能需要你手写sql语句
    

    注意事项:

    1.django的orm不会自动帮你创建库,库需要你自己手动创建
    表会自动帮你创建 你只需要书写符合django orm语法的代码即可

    去应用下所在的models.py中书写类:

    from django.db import models
    
    # Create your models here.
    class Userinfo(models.Model):
        # 设置id字段为userinfo表的主键  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()
    

    数据库迁移(同步)命令

    python manage.py makemigrations  # 不会创建表 仅仅是生成一个记录  将你当前的操作记录到一个小本本上(migrations文件夹)
    
    python manage.py migrate  # 将你的orm语句真正的迁移到(同步)到数据库中
    
    只要你在models.py中修改了跟数据库相关的代码  你就必须重新开始执行上面两条命令
    

    数据的增删改查

    1.查

    def edit_user(request):
        edit_id = request.GET.get('edit_id')
        edit_obj = 	models.User.objects.filter(pk=edit_id).first()
        return render(request, 'edit_user.html', 						locals())
    

    2.增

    def register(request):
        if request.method == 'POST':
            username = request.POST.get('username')
            password = request.POST.get('password')
            models.User.objects.create(username=username, password=password)
        return render(request, 'register.html', locals())
    

    3.改

    models.User.objects.filter(pk=edit_id).update(username=username, password=password)
    

    4.删

    models.User.objects.filter(pk=edit_id).delete()
    

    路由层

    无名分组和有名分组

    无名分组

     url(r'^index/(d+)/',views.index)
    在调用视图函数index的时候 会将d+匹配到的内容 当做位置参数传递给index
    

    有名函数

    url(r'^index/(?P<year>d+)/',views.index)
    在调用视图函数index的时候 会将d+匹配到的内容 当做关键字参数(year='')传递给index
    

    注意

    无名有名不能混合使用 但是可以单独使用 单独使用的时候支持多个

    反向解析

    本质:根据某一个东西得出一个结果 该结果可以直接访问到对应的url

    没有正则表达式的反向解析

    url(r'^index/',views.index,name='xxx')
    # 起别名 别名一定不要重复
    前端反向解析
    {% url 'xxx' %}
    后端反向解析
    from django.shortcuts import reverse
    	url = reverse('xxx')
    
    

    无名分组和有名分组反向解析

    无名
    url(r'^index/(d+)/',views.index,name='xxx')
    前端反向解析
    {% url 'xxx' 123 %}
    后端反向解析
    from django.shortcuts import reverse
    url = reverse('xxx',args=(123,))
    """个人建议:在处理容器类型数据的时候 无论有几个值 你最后都加一个逗号"""
    
    有名
    url(r'^index/(P<year>d+)/',views.index,name='xxx')
    前端反向解析
    {% url 'xxx' 123 %}
    {% url 'xxx' year=123 %}  # 了解
    后端反向解析
    from django.shortcuts import reverse
       url = reverse('xxx',args=(123,))
       url = reverse('xxx',kwargs={'year':123})  # 了解
    """个人建议:在处理容器类型数据的时候 无论有几个值 你最后都加一个逗号"""
    

    路由分发

    django中的每一个app都可以有自己独立的static文件夹,templates文件夹,urls.py等
    正是由于上述的特点 你基于django开发项目 就真正可以做到分组分功能分模块独立的去开发

    当应用特别多的时候 总路由中的代码过于冗长 不好维护

    1.在应用下自己手动创建urls.py
    2.在路由中导入
    #1:
    from app01 import urls as app01_urls
    from app02 import urls as app02_urls
    
    url(r'^app01/',include(app01_urls)),
    url(r'^app02/',include(app02_urls))
    
    #2
    url(r'^app01/',include('app01.urls')),
    url(r'^app02/',include('app02.urls')) 
    

    名称空间

    url(r'^app01/',include('app01.urls',namespace='app01')),
    url(r'^app02/',include('app02.urls',namespace='app02')) 
    # app01 urls.py
    url(r'^index/',views.index,name='index')
     # app02 urls.py
    url(r'^index/',views.index,name='index')
    url = reverse('app01:index')
                url = reverse('app02:index')
                {% url 'app01:index' %}
                {% url 'app02:index' %}
    # app01 urls.py
    url(r'^index/',views.index,name='app01_index')
    # app02 urls.py
    url(r'^index/',views.index,name='app02_index')
    

    伪静态

    url看起来像是一个静态页面(.html结尾)

    虚拟环境

    不同的项目应该有各自独立的解释器环境 最大化节省资源
    实际功能中针对不同的项目 会有一个叫requestsments.txt文件
    该文件中列出来是一个个该项目需要用的到模块名和版本号
    eg:
    django = 1.11.11
    nginx = 1.21
    后期通过命令直接会去下载该文件内所有的模块及对应版本

    虚拟环境 就类似于是个python解释器环境 每创建一个就类似于重新下载了一个纯净的python解释器环境
    建议 你的机器上不要有态多的虚拟环境
    当前我们这个阶段 建议你所有的模块全部都安装在本机环境中

    django版本区别

    url和path
    path第一个参数不支持正则 写什么就匹配什么 精准匹配
    re_path跟url是一模一样的用法

  • 相关阅读:
    centos6.5 安装redis自动启动
    正则去除字符串中的特殊字符
    数据库存储去重
    pymysql.err.ProgrammingError: (1064)(字符串转译问题)
    [转] Linux下SVN的三种备份方式
    ASP.NET ASHX中访问Session
    ionic 里使用 iframe 可能遇到的问题
    ionic $http 无法正常访问外部web服务器的问题
    Mac下80端口相关
    IIS7 无法写入配置文件web.config 错误
  • 原文地址:https://www.cnblogs.com/zhangmingyong/p/11716686.html
Copyright © 2011-2022 走看看