[TOC]css
版本问题 1.X 2.X 统一制定1.11.11 安装 pip3 install django==1.11.11 测试 django-admin
wsgiref模块能根据功能的不一样拆分红不一样的文件,用户在浏览器窗口输入url之因此能狗获取到相应的资源,是由于后端早已经开设了相应 资源接口。html
wsgiref特色:前端
urls.py:路由与属性函数的对应关系python
views.py:里面就是放的一堆视图函数(视图函数也能够是函数也能够是类)mysql
templates文件夹:里面放的就是一堆HTML文件(模板文件夹)web
大白话:wsgiref模块做用是帮你将复杂的socket链接封装,将用户输入的数据作处理,并把后端发送给浏览器的数据也作处理。sql
from wsgiref.simple_server import make_server
数据是写死的,万年不变数据库
数据是动态获取的:django
提供了一个能够在HTML页面上书写相似于python后端的 代码,来操做数据(模板语法)flask
pip3 install jinja2 下载安装模块
flask框架模板语法使用的就是jinja2模块,因此只要下载了flask框架,就会自动下载jinja2模块。
模板语法(jinja2)模块语法很是贴近python语法,可是并非全部的框架使用的都是jinja2模块语法
模板语法 {{}} 变量相关 {%%} 逻辑相关 在HTML文件内的语法示例: {{ xxx }} <p>{{xxx.username}}</p> <p>{{xxx['password']}}</p> <p>{{xxx.get('hobby')}}</p> <p>{{xxx.get('hobby')[0]}}</p> <p>{{xxx.get('hobby').1}}</p> {%for user_dict in xxx %} <tr> <td>{{ user_dict.id }}</td> <td>{{ user_dict.name }}</td> <td>{{ user_dict.hobby }}</td> </tr> {% endfor %}
A:socket B:路由分发 C:模板渲染 django A:用的别人的 wsgiref B:本身写的 C:本身写的 flask A:用的被人的 werkzeug B:本身写的 C:用的别人的 jinja2 tornado A,B,C都是本身的。追求速度
python三大主流框架
异步非阻塞,自然支持高并发,甚至能够用它来开发游戏服务器。
注意事项
版本问题
1.x版本
2.x版本
3.x版本(目前不用考虑)
推荐使用1.x版本里面的1.11.09-1.11.13,由于2.x版本才发行不久,新公司或者更换了版本的公司才会使用,通常使用1.8或1.11,现已逐步往1.11转
安装
pip3 install django==1.11.11
测试是否安装成功
命令行输入:django-admin
命令行
建立django项目
语法:django-admin startproject mysite(项目名)
效果:建立一个mysite文件夹
启动django项目(先切换到项目目录下)
语法:python manage.py runserver 必须在cmd管理员启动(django默认端口是8000)
建立具备独立功能的app,一般状况下应该能作到见明之义。
语法:python manage.py startapp app名字
在Django项目中建立好app以后必定要去settings.py注册才有效
注意:
1.使用命令行建立的django项目是不会自动建立templates模板文件夹的,只能本身手动建立
2.命令行建立的django项目不但没有templates文件夹,配置文件中也没有填写路径(而pycharm建立会自动添加)
全名application 应用,此app非彼app.
django实际上是一个专一于开发app的web框架,一个空的django项目就相似于一所大学,app就相似于大学里面的各个学院。
每一个app就相似于不一样的功能模块
mysite -mysite --__init__.py --settings.py 项目配置文件 --urls.py 路由视图函数对应关系,项目的总路由 --wsgi.py -manage.py app01 --migrations文件夹 数据库改动记录 ----__init__.py --__init__.py --admin.py django后台管理 --apps.py 注册app类 --models.py 模型类(orm) --tests.py 测试文件 --view.py 视图函数(******) db.sqlite3 django自带的一个小型用于本地测试的数据库(对日期格式的数据不是很敏感)
1.代码修改了始终没有效果: 1.在同一个端口起了多个服务 一直跑的是最开始的那个服务 2.浏览器缓存问题 2.建立app以后必定必定要先去setting文件中注册 1.django可以自动重启 可是它的重启机制 2.只要检测到你的代码有变化 在必定的时间间隔内就会自动重启 3.因此有时候可能会出现 你代码还没写完 就已经自动重启了 1.python解释器不要用3.7及以上版本 2.计算机名称不能有中文 3.文件名称也尽可能不要用中文 4.一个pycharm窗口就跑一个django项目
1.HttpResponse 返回字符串 return HttpResponse('字符串') 2.render 返回html页面 return render(request,'templates文件夹下的html文件名',{'xxx':'hello world'}) 页面上就能够经过{{xxx}}拿到hello world 模板的渲染(将数据在后端按照模板语法放入html对应的位置) 3.redirect 重定向 return redirect(url) # url能够是别人网站的全路径 也能够是本身网站的url后缀 return redirect('/index') return redirect('https://www.mzitu.com')
什么是静态文件 网站所使用到的提早已经写好了的文件 eg: css js 第三方的组件 bootstrap sweetalert fontawesome
网站所用到的html文件统一放到templates文件夹中
那针对网站所使用到的静态文件也应该单独找一个文件夹来存储
这个文件夹 默认状况下都叫static,须要手动本身建立
static -css 网站所用到的全部的css文件 -js 网站所用到的全部的js文件 -image 网站所用到的全部的图片文件 第三方文件
STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), os.path.join(BASE_DIR, 'static1'), os.path.join(BASE_DIR, 'static2') ]
当你的接口前缀正确以后 会拿着后面的路径依次去下面列表中的每个文件夹下查找对应的资源 顺序是从上往下依次查找 若是都没有找到才会报错
这里的static是文件夹路径
那么问题来了,若是STATIC_URL要修改,其他的所有文件都要修改,及其不方便。咱们怎么办呢?
咱们能够想办法动态绑定,让STATIC_URL不管怎么改变,对应的href前缀跟着改变就解决了。
{% load static %} //相似于import导入 <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}"> <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
form表单默认是以get请求提交数据的 http://127.0.0.1:8000/login/?username=admin&password=123 action 1.不写 默认朝当前地址提交数据 2.全路径 3.后缀(/index)
request.method # 结果是一个纯大写的字符串 GET/POST request.POST # 获取post请求提交的数据 相似因而一个大字典 # <QueryDict: {'username': ['admin', 'jason'], 'password': ['123']}>
get方法:针对只有一个值,用户名、密码 request.POST.get() # 只会取列表最后一个元素 request.POST.getlist() # 取出整个列表,针对对选框、多个值操做
一般状况这样写:
POST请求相似于一个大字典
须要你本身提早建立好对应的库
1.先去配置文件中配置相关参数 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 数据库类别 'NAME': 'jeff', # 库的名字 'HOST':'127.0.0.1', 'PORT':3306, 'USER':'root', 'password':'123', 'CHARSET':'utf8' } } 2.在项目名或者应用名下面的__init__文件中告诉django使用pymysql连接数据库而不是用默认的mysqldb import pymysql pymysql.install_as_MySQLdb()
django orm不会帮你建立库 只能帮你自动建立表
orm对象关系映射 类 表 对象 记录 属性 字段值 做用:可以让一个不会数据库操做的小白也可以经过Python面向对象语法 句点符来简单快捷的操做数据
首先须要先去对应的应用下的models.py中书写你的模型类
对于主键id,django orm会自动帮你建立一个名字为id的主键字段。当检测到你建立了主键,那么会使用你本身建立的。若是没有那么会自动帮你建立。 models.py class User(models.Model): id = models.AutoField(primary_key=True) // id int primary key auto_increment name = models.CharField(max_length=32) // name varchar(32) password = models.IntegerField() // password int
1.python3 manage.py makemigrations # 仅仅是将你对数据库的改动记录到某个小本本上(migrations文件夹) 2.python3 manage.py migrate # 将改动真正的同步到数据库中 """ 上面两个命令永远是成对出现的 只要你执行了1 就必需要执行2 """ *******只要你动了models.py跟数据库相关的代码 你就必需要从新执行上面的两条命令来保证数据库与models.py一致*********** 3.逆向数据库到模型 python manage.py inspectdb > app名字/models.py
对于增删改查都须要先获取用户选择修改的数据id。那么咱们怎么获取呢?
第一步:把用户的id绑定到按钮标签上
咱们能够拼接url:获取用户点击的标签id。绑定id <a href="/edit_user/?edit_id={{ user_obj.id }}" class="btn btn-primary btn-xs">编辑</a>
第二步:获取绑定到url的用户id
字段的增 1.create() user_obj = models.User.objects.create(name=username,password=password) # 该方法有返回值 返回值就是当前被建立的对象自己 2.对象绑定方法 # 1 先生成一个User对象 user_obj = models.User(name=username,password=password) # 2 调用对象的绑定方法 user_obj.save() 字段的查 1.filter() //相似于where from app01 import models res = models.User.objects.filter(username='jason') # select * from user where # 返回的结果是一个列表 支持索引取值可是不支持负数而且不推荐使用 推荐你使用它给你封装好的方法 推荐(重):user_obj = res.first() # filter方法条件不存在的时候 不会报错返回的是一个空列表 filter括号内直接放多个关键字参数 而且多个关键字参数之间是and关系 models.User.objects.filter(username='jason',password='123') 相似于sql语句:# select * from user where username='jason' and password='123'; 2.查全部的数据 1.filter() 括号内不写拿全部 2.all() 拿全部 字段的改 # 方式1(推荐) 批量更新 models.User.objects.filter(id=edit_id).update(name=username,password=password) # 方式2(了解) # 1 先获取数据对象 edit_obj = models.User.objects.filter(id=edit_id).first() # 2 再修改对象属性 edit_obj.name = username edit_obj.password = password # 3 调用对象的绑定方法保存 edit_obj.save() 删 models.User.objects.filter(id=delete_id).delete() # 将filter过滤出来的数据所有删除
原文出处:https://www.cnblogs.com/guyouyin123/p/12147138.html