day 61 Django part-1 django的安装,以及初学者三件套
Posted 孟郊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了day 61 Django part-1 django的安装,以及初学者三件套相关的知识,希望对你有一定的参考价值。
我们的django到底是什么东西呢?
我们的代码都是在后台写的,包括我们的pycharm都是属于后台的工具,但是我们的后端开发说到底是需要开发完了之后拿到用户面前的,让我们的用户看到我们的东西,首先要让他们看到,然后才能够在看到的基础上来进行一些交互,然后大体的框架就算是搭建成功了,再接下来就是细节的填充,以及功能的扩展,根据业务的发展以及用户的需求去满足,一一实现需求.
上面说了一通的废话,我们的django到底跟这一切又有什么关系呢?
我们的代码是后端的东西,它如果放到用户的眼前是需要一些过程的,我们的前端是可以让我们的用户直观的看到效果,我们的前端改动一些标签就可以让用户明显感受到差异,所以我们的前端是跟用户交互更加直接的,但是前端的功能都是一些浮于表面的东西,它是作为装饰的,很多的功能仅仅靠前端是无法实现的,需要后端来进行功能的主要开发,然后前端再在后端的基础上进行页面的渲染,实现用户的交互,那么我们的前端就需要跟后端关联上,要怎么实现关联上的同时还能不出错的无缝衔接上稳定地投入使用呢?,这个时候就需要我们的django了,它就是让我们的前端和后端无缝衔接上的同时,稳定地投入使用,我们的web框架就是干这个事情的,下面我们会提到web框架的本质,它最根本的就是socket套接字通信,我们开启一个服务端然后它就能够永远稳定地运行下去,接下来我们的客户端配好了端口和ip地址的时候就能够连接上它,我们的django就封装的有这个socket套接字功能,它本身就自带套接字通信功能,所以,你看我们需要用到的东西在这个django里面统统都会实现,它很牛逼吧,什么都是自带的,然而它还不仅仅是这样,它的功能远远比我们想象得的要强大得多,暂且就理解它为一个封装了超多功能的异常庞大的模块吧,我们要实现前后端的交互它是少不了的.
它里面有超多的封装好的模块.我们只需要在使用的时候把它想起来然后就跟我们引入模块或者引入文件的时候一样使用import 就可以引入到你的代码块里面进行使用了
它核心的三件套是必须要掌握的,一切的功能都是基于这三者来实现的,
Httpresponse,--负责来响应浏览器的,需要浏览器返回什么就在它里面定义什么即可,浏览器的根本就是返回字符串,所以Httpresponse("str(ok)")这样写就可以
render, --负责接收request参数,然后还有一个渲染的页面(也就是一个html标签),以及保存数据用的一个字典数据类型的参数.这个render主要的功能就是渲染页面,在渲染的同时我们需要把一些参数填充到所渲染的页面里面去,就需要用到这个render功能,[那我们什么时候需要使用到参数去填充页面的情况呢,我们的页面是提前写好的,那是前端的时候,现在我们需要跟后端进行一些交互,这个时候前端显示的数据就会有所调整,根据特殊的要求来进行调整,这个时候我们的代码就需要后端来实现了,把后端改好的代码填充到前端去,就需要把前端的页面设置一块地方用来预存参数,当我的后端需要改变功能的时候可以启动到前端预存的那些参数然后进行修改,这个时候就需要使用到填充参数到所渲染的页面中去]
redirect,--负责跳转页面,后端的代码块码完之后我们想让页面往何处跳转就使用它去跳转,return redirect("/sogo/") 这里就是跳转的页面,之所以这样写,是因为我们的url域名里面都是这样的格式,https://i.cnblogs.com/EditPosts.aspx?postid=8269914,例如这里的http后面的域名就是这样的格式,
这里还有一个很重要的点就是request,它是一个参数,是我们在django里面写函数的时候需要传入的参数,这个参数是干什么用的呢,它里面包裹了大量的信息,都是关于请求的数据信息,
所有跟请求相关的数据都是由它来进行接收,我们的形参就是用来接收各种的参数的,它就是那样的一个形参,它只是接收跟请求相关的参数,我们以后会学到它的大量的用法,包括都有哪些是跟请求相关的,请求都是有哪些,等等.
老师的笔记:
day61 1.前情回顾 1. pymysql 使用: 安装 pip install pymysql 导入 import pymysql 具体使用: 1. 创建连接 conn = pymysql.connect(host="lcoalhost", port=3306, user="", password="", database="", charset="utf8") 2. cursor = conn.cursor() 3. cursor.execute(sql, (arg1, arg2 ...)) --> SQL注入问题 4. 增删改查 增: cursor.execute("insert into ...", (arg1, arg2...)) conn.commit() --> 向数据库提交 cursor.lastrowid --> 获取刚插入的那条数据的ID 删: cursor.execute(“delete ...”, (arg1, arg2...)) conn.commit() --> 向数据库提交 改: cursor.execute("update ...”, (arg1, arg2...)) conn.commit() --> 向数据库提交 查: cursor.execute(“select ...”, (arg1, arg2...)) cursor.fetchone() --> 查单条数据,元组类型 cursor.fetchmany(n) --> 查多条数据 cursor.fetchall() --> 查所有数据 cursor.scroll(n, mode="relative") --> 相对移动 cursor.scroll(n, mode="absolute") --> 绝对移动 批量执行: cursor.executemany("update ...”, ((arg1, arg2),(arg1, arg2),(arg1, arg2))) conn.commit() 回滚: try: cursor.execute("update ...”, (arg1, arg2...)) conn.commit() --> 向数据库提交 except Exception as e: logging.error(str(e)) conn.rollback() cursor.close() conn.close() 2. 今日内容 Web框架(绝大部分内容) 浏览器 socket客户端 4. 客户端连接服务端 5. send() 客户端发数据 8. recv() 接收服务端回复的数据 9. close() 关闭链接 博客园服务器 socket服务端 1. bind IP和端口 2. listen() 监听 3. accept() 等待连接 6. recv() 接收数据 7. send() 回复数据 FTP上传文件的: msg = "upload|filename|1024" 服务端解析: msg.split() -> 浏览器和你的web服务端通信需要遵循一个规则,这个规则就是HTTP协议。 HTTP协议: 简单的理解成 规定了消息的格式 浏览器发送 ---> 请求 (request) 服务端回复 ---> 响应 (response) 请求和响应的格式: Header (头)\\r\\n\\r\\n Body (体) 请求: GET请求的格式: 只有请求头没有请求体 "GET / HTTP/1.1\\r\\n k1:v1\\r\\n k2:v2\\r\\n .... " POST请求的格式: "POST / HTTP/1.1\\r\\n k1:v1\\r\\n k2:v2\\r\\n .... " Body 响应: Header Body 渲染 (render) 本质上: 用数据去替换HTML页面中的特殊字符 jinja2 Flask 总结: 自己定义的web框架 a. 自己写socket处理请求相关的数据(web服务端) wsgiref uWSGI gunicorn WSGI协议: Python Web服务端和Python 应用程序之间通讯的一个标准 b. URL -> 函数 --> 函数里面写业务逻辑(取到数据) c. 把数据填充到HTML页面(字符串替换) 分类: 1. a、b、c都是用自己的 --> Tornado 2. a用别人的,b和c用自己的 --> Django 3. a和c都用别人的,b用自己的 --> Flask 另外一个维度的分类: 1. Django (大而全) 2. 其他 (小而精) Django: 安装: pip install django==1.11.9 新建Django项目: 命令行方式: > 先进入到你新建的项目要存放的目录 > django-admin startproject s8 > cd s8 > python manage.py runserver PyCharm方式: File -> new project -> 选Django -> 起名字 -> 点右下角create 启动Django项目: 命令行方式: python manage.py runserver 127.0.0.1:8888 python manage.py runserver 8888 PyCharm方式启动:(PyCharm单独打开你的Django项目) 1. 点页面上方中部位置的绿色小三角 直接运行 Ctrl + C 停止 Django项目目录结构: s8 -s8 -settings.py -urls.py URL --> 函数的对应关系 -wsgi.py -manage.py 新手必备三件套: from django.shortcuts import HttpResponse, render, redirect 跟request相关的方法: request.method request.POST request.POST.get("key") --> 获取对应的值 新建Django项目三件事: 1.注释csrf那一行 2. 配置静态文件 3. 检查templates配置项 3. 今日作业 把你之前用Bootstrap写的那个登录页面,用Django跑起来 1. 静态文件的摆放位置 ****** 2. 登陆用POST提交数据,使用pymysql去数据库里取用户数据校验 3. 登陆成功跳转到 http://www.luffycity.com 4. 登录失败就返回当前页面
day62 1. 前情回顾 1. Django配置相关 1. Templates文件夹配置 --> 存放所有的HTML文件 # HTML页面存放位置 TEMPLATES = [ { \'BACKEND\': \'django.template.backends.django.DjangoTemplates\', \'DIRS\': [os.path.join(BASE_DIR, \'templates\')] # 你的HTML文件的目录 , \'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\', ], }, }, ] 2. 静态文件 # 在HTML页面上引用静态文件时写的名字 STATIC_URL = \'/static/\' # 静态文件(CSS文件和JS文件)存放的实际位置 STATICFILES_DIRS = [ os.path.join(BASE_DIR, "xxx"), # F:\\PythonS8\\day61\\mysite\\xxx ] 3. 注释掉csrf相关的中间件 # 中间件 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\', ] 2. 新手必备三件套 from django.shortcuts import HttpResponse, render, redirect 1. HttpResponse("字符串") 2. render 1. render(request, "html文件") --> 相当于打开HTML文件,读取文件内容,回复给浏览器 2. render(request, "html文件", {"k1": "v1", "k2": "v2"}) --> 相当于打开HTML文件,读取文件内容,使用字符串替换,替换完的内容回复给浏览器 3. redirect("具体要跳转的URL") 3. request这个参数 1. 封装了所有跟请求相关的数据,是一个对象 2. 目前我们学过 1. request.method GET,POST ... 2. request.POST.get("input name的值") 2. 今日内容 学员管理系统 学生 老师 班级 班级和老师关系表 id 姓名 cid id 姓名 id 名称 id tid cid 1 李岩 1 1 Egon 1 1 1 2 建超 2 2 Eva_J 1 全栈8期 2 1 2 3 晓梅 3 3 WuSir 2 全栈9期 3 2 1 4 Yuan 3 全栈10期 4 4 2 5 4 3 1. 创建班级表 -- 创建班级表 CREATE TABLE class( id INT AUTO_INCREMENT PRIMARY KEY , cname CHAR(20) NOT NULL UNIQUE )ENGINE =innodb DEFAULT CHARSET="utf8"; 2. 创建老师表 -- 创建老师表 CREATE TABLE teacher( id INT AUTO_INCREMENT PRIMARY KEY , tname CHAR(20) NOT NULL UNIQUE )ENGINE=innodb DEFAULT CHARSET="utf8"; 3. 学生表 -- 创建学生表 CREATE TABLE student( id INT AUTO_INCREMENT PRIMARY KEY, sname CHAR(20) NOT NULL UNIQUE , cid INT,FOREIGN KEY (cid) REFERENCES class(id) ON DELETE CASCADE ON UPDATE CASCADE )ENGINE=innodb DEFAULT CHARSET="utf8"; 4. 班级和老师关系表 -- 创建班级和老师关系表 CREATE TABLE class_2_teacher( id INT AUTO_INCREMENT PRIMARY KEY , tid INT, FOREIGN KEY (tid) REFERENCES teacher(id) ON DELETE CASCADE ON UPDATE CASCADE, cid INT, FOREIGN KEY (cid) REFERENCES class(id) ON DELETE CASCADE ON UPDATE CASCADE )engine=innodb DEFAULT CHARSET="utf8"; 模板语言:(jinja2) 现在学到的: 1. {{ 变量名 }} # 我们的HTML标签里面可以找一个代码逻辑合适的地方就直接写上两个重叠的大括号---{{}},然后在里面写上变量名[即函数里面会用到的参数],如果我们的变量名是一个字典的话,那么我们的这个大括号的语法是支持存入这样的本身是一个字典的变量名的,而且支持我们在取值的时候使用到如下的例子 如果传过来的变量是字典--> p = {"name": "alex", "age": 18} 支持:p.name 和 p.age 取值,一般取值的话都是通过循环来取值的,这里就引出了我们的下面的循环用法 2. for循环 {% for i in 变量名 %} # 如果我们的变量名是一个字典的话,我们是可以通过使用到i.key去取值的,就拿上面的例子来说,我们的变量名是p,那么就是{% for i in p %}, {{i.name}}, {{i.age}} {{% endfor %}} {{forloop.counter}} # 这里是从0开始如果这样写就是 # {{forloop.counter1}}从1开始 {{ i }} {% endfor %} {{forloop.counter}} {{forloop.counter0}} GET请求传参数的方式: /xxx/?k1=v1&k2=v2 ? 前面的是URL ?后面的是请求的参数 多个参数之间用&分隔 如下示例: https://i.cnblogs.com/EditPosts.aspx?postid=8269914 EditPosts.aspx?它后面就是key-value的格式,key是postid,value是8269914, 再如下示例:https://mbd.baidu.com/newspage/data/landingsuper?context=%7B%22nid%22%3A%22news_15802839984148081810%22%7D&n_type=0&p_from=4 这里面的key-value对应的有: context = %7B%22nid%22%3A%22news_15802839984148081810%22%7D & # 这里就是分割符, n_type = 0 & p_from = 4 POST请求传数据: 是放在请求体里面的
创建django项目使用cmd命令行执行:
django-admin startproject (项目名,自定义)
创建之后需要执行,也使用cmd命令行实现:
我们需要把当前目录切换到所创建的项目目录里面去,然后再执行下面的命令行语句,否则会报错:no such file or directory .
切换目录使用cd /d 所创建的项目目录,一般我们刚刚创建的项目就直接使用cd 项目名称即可直接切换到所创建的项目目录里面去,
python manage.py runserver ip和端口:如下举例:
python manage.py runserver 127.0.0.1:8000
如果你想查看你的django安装的版本或者检查你是否已经安装了django,那么我们在cmd命令行里面输入以下信息就可以得出结果:
python -m django --version
如果你已经安装了,那么它会有提示你安装的版本,如果没有安装的话它会有错误提示信息:“No module named django”。
我们在创建django项目的时候在cmd里面,可以先使用cd /d 指定的文件路径,例如: cd /d D:\\file 这样就是改变了当前的文件路径,然后我们再执行创建django项目操作
我们的django项目创建到执行的简单步骤:
首先我们的项目创建完之后需要在单独的窗口打开,不能更它的项目一起打开
如图所示我们的项目是单独在一个窗口打开的,
我们的static是静态文件存放夹,所有的静态文件都是放在这里,我们可以在static里面建立css文档,js文档,img文档,专门用于存放专门的文件,还有其他的一些存放于plugins中,其他的比如我们之前写bootstrap用到的相关文档都存放于plugins里面
我们自己建立的这个文件夹,这个是一开始创建之后就需要建立好的,可以是任何其他的名字,只不过我们使用这个名字,大家都是约定俗成的,写成这样之后大家都知道它是干什么的,如果写作其他的就只有你自己知道它是干什么的,别人都不知道,这样沟通的成本就会增加,
还有就是在nun_one(这本身就是我给我自己新建的django项目起的名字)里面的py文件里有一个views.py它是我们自己手动添加上去的,它不是你建立项目的时候就自带的,这里是我们存放我们写的后台代码块的地方,所有的后台的代码都是存放于这里的,
还有一个templates它里面存放的都是html文件,所有的html文件都需要存放于这里,这些都是规矩,我们要想使用django就需要遵守它的规范,然后才能顺利运行它.
setting文件的设置如下:
""" Django settings for nun_one project. Generated by \'django-admin startproject\' using Django 1.11.9. For more information on this file, see https://docs.djangoproject.com/en/1.11/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/1.11/ref/settings/ """ import os # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = \'go7=2^)p%q!g-dviz#9i7djz6)xf-m#0a7m2)an2)vmty-_o8(\' # SECURITY WARNING: don\'t run with debug turned on in production! DEBUG = True ALLOWED_HOSTS = [] # Application definition INSTALLED_APPS = [ \'django.contrib.admin\', \'django.contrib.auth\', \'django.contrib.contenttypes\', \'django.contrib.sessions\', \'django.contrib.messages\', \'django.contrib.staticfiles\', ] 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\', ] ROOT_URLCONF = \'nun_one.urls\' 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\', ], }, }, ] WSGI_APPLICATION = \'nun_one.wsgi.application\' # Database # https://docs.djangoproject.com/en/1.11/ref/settings/#databases DATABASES = { \'default\': { \'ENGINE\': \'django.db.backends.sqlite3\', \'NAME\': os.path.join(BASE_DIR, \'db.sqlite3\'), } } # Password validation # https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ { \'NAME\': \'django.contrib.auth.password_validation.UserAttributeSimilarityValidator\', }, { \'NAME\': \'django.contrib.auth.password_validation.MinimumLengthValidator\', }, { \'NAME\': \'django.contrib.auth.password_validation.CommonPasswordValidator\', }, { \'NAME\': \'django.contrib.auth.password_validation.NumericPasswordValidator\', }, ] # Internationalization # https://docs.djangoproject.com/en/1.11/topics/i18n/ LANGUAGE_CODE = \'en-us\' TIME_ZONE = \'UTC\' USE_I18N = True USE_L10N = True USE_TZ = True # Static files (CSS, javascript, Images) # https://docs.djangoproject.com/en/1.11/howto/static-files/ STATIC_URL = \'/static/\' STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static"), # 我们需要在设置里面查看我们的拼接路径, # 这个拼接路径是需要自己手动写的,有问题的话先来看这里的设置路径,先查看我们的setting # os.path.join(BASE_DIR, "sta") ]
url文件的设置如下:
"""nun_one URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/1.11/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: url(r\'^$\', views.home, name=\'home\') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: url(r\'^$\', Home.as_view(), name=\'home\') Including another URLconf 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r\'^blog/\', include(\'blog.urls\')) """ from django.conf.urls import url from django.contrib import admin from django.shortcuts import HttpResponse, render, redirect # 这里是django的三件套,它的主要核心模块内容,shortcuts是关键字 from .views import index, hm_btst, class_list, \\ class_form, add_class, delete_class, edit_class, \\ teacher_form, add_teacher, edit_teacher, delete_teacher # 这里我们需要使用加上. 然后就不会报错,这里是对当前目录做一个限定,我们需要引用我们自己写入的模块那么就需要另外起一行去写 urlpatterns = [ url(r\'index/\', index), # 这里r后面的引号里面不用加上前/,只需要把后/加上即可 url(r\'hm_bootstrap/\', hm_btst), # 这里的括号里需要写入两个参数,一个是域名, # 放到r后面,然后还有函数名,需要放到域名后面,函数名需要在上面引入才可以,否则这里会报错,不会生效的 url(r\'class_list/\', class_list), url(r\'class_form/\', class_form), url(r\'add_class/\', add_class), url(r\'delete_class\', delete_class), url(r\'edit_class/\', edit_class), url(r\'teacher_form/\', teacher_form), url(r\'add_teacher/\', add_teacher), url(r\'edit_teacher/\', edit_teacher), url(r\'delete_teacher\', delete_teacher), # url(r\'^admin/\', admin.site.urls), ]
views文件里面是我们写好的后端代码块:
import pymysql from django.shortcuts import HttpResponse, render, redirect def index(request): # return HttpResponse("ok") error_msg = "" # 我们之前就是把这里的变量放到了下面的if判断里面了, # 然而我们的method可能是post也可能是get,所以需要把这里的变量放到if判断外面, # 这样就是全局的变量了,这样我们的get和post都可以使用到它, # 而我们之前就是把它定义到了if判断下面了,不仅仅是放到了if post下面而且还放到了 # if post下面的else里面,就相当于它的作用域就更加狭窄了,所以我们报错就会显示我们的这个变量没有被定义就直接调用了, # 这样当然不符合语法,一定会报错的 print("--->:", request.method) if request.method == "POST": name = request.POST.get("username") pwd = request.POST.get("password") # pwd = request.POST["password"] print(request.POST) print(name, pwd) # 这里的数据判断应该是从数据库里面取出数据来进行对比的,设计到mysql的操作 conn = pymysql.connect( host="localhost", user="root", database="book_list", password="123", ) cur = conn.cursor() sql = "select name, pwd from userinfo ;" cur.execute(sql) ret = cur.fetchall() print(ret) for i in ret: if i[0] == name and i[1] == pwd: return redirect("http://www.luffycity.com") else: error_msg = "you\'ve gotten wrong msg" return render(request, "index.html", {"error": error_msg}) def class_list(request): # conn = pymysql.connect( # host="localhost", # user="root", # password="123", # database="book_list", # charset="utf8") # cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # sql="select id,name from class order by id;" # cursor.execute(sql) # ret = cursor.fetchall() #重修课程day61(django之补充)