Day/3
案例实现:
“创建项目”
执行cd ~/Desktop/ 将项目创建在桌面上,方便管理
创建虚拟环境
查看虚拟环境是否有配置 workon
创建虚拟环境 mkvirtualenv -p python3 py3_django_12
生成文件 django-admin startproject bookmanger
报错的话下载django pip install django==1.11.11
检查是否创建成功 tree
“创建子应用”
执行 python manage.py startspp 子应用名称 是在manage.py路径执行
在pycharm打开工程项目,并配置好环境
“子应用注册”
- 在setting.py中的INSTALL_APPS进行注册
“本地化设置”
LANGUAGE_GODE = ‘zh-Hans’ 设置中文
TIME_ZONE = ‘Asia/Shanghai’ 设置亚洲时区
第一次登录后是无账号无密码,需要手动创建,密码长度要8位,且包含数字和字母
注意要先执行数据迁移指令,建表格Day/2中
命令:python manage.py createsuperuser
“项目中匹配的urls”
在Day/2中
“准备视图函数”
在Day/2中
“开启服务器”
python manage.py runserver
在浏览器地址栏输入地址:http://www.127.0.0.1:8000/子应用名称/index
配置文件与静态文件:
“配置文件”
DEBUG = True
当程序出现异常时,会显示报错信息,且修改代码后会重启服务
ALLOWED_HOSTS
循序哪些主机访问项目
BASE_DIR
通过__file__属性,可以查找当前该模块的文件夹
os.path.abspath(__file__) 获取当前文件夹的绝对路径
os.path.dirname 获取当前文件夹的上一级目录
本地语言和时区
LANGUAGE_GODE = ‘zh-Hans’ 设置中文
TIME_ZONE = ‘Asia/Shanghai’ 设置亚洲时区
“静态文件”
创建位置:推荐在根路径下,名字固定为static
哪些文件是静态文件:css图片 js都是静态文件
配置参数
STATIC_URL = ‘/static/’ 访问静态文件的url的前缀
1. 存放动态文件的目录
'DIRS' : \[os.path.join(BASE.DIR, 'templates')], 2. 存放静态文件的目录 ,注意参数名字固定,不能改!!! STATICFILES\_DIRS = \[os.path.join(BASE.DIR, 'static')]
“django是如何区分 动态资源和静态资源”
核心的参数: STATIC_URL = ‘/static/’
访问静态文件资源时。遵循一个规则:http://ip:port + /STATIC_URL的值 + /文件名
配置:
连接mysql数据库
1、更改如下:在setting.py文件中
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 'HOST': '127.0.0.1', 'PORT': 3306, 'USER': 'root', 'PASSWORD': 'mysql', # 数据库密码 'NAME': 'book' # 数据库名字 } }
2、需提前安装好pip install PyMySQL
3、在工程项目的__init__.py文件中写入(不是子应用的__init__.py文件)
import pymysql pymysql.install_as_MySQLdb()
作用:
django的ORM能够以musqldb的方式调用pymysql
4、在linux终端进入mysql,创建数据库
1、执行创建命令:create database 数据库名称 charset=utf8;
2、use book;
URLconf:
“重点”
Django默认 127.0.0.1
以字符串形式加的 当指定ip运行后,是无法访问到后端的!解决思路:需要将运行的域名加到ALLOWED_HOSTS
它是一种安全机制,即只允许添加进来的主机进行访问
在ALLOW_HOSTS里添加的多个IP可以同时访问 访问的时候 python manage.py runserver 0:8000
路由URL:
查找规则从上至下,会有屏蔽效应,解决的方法:正则内最后加个$符号即可,但是一般是在子路由里加,工程总路由不加。
urlpatterns = [ url(r'say$', views.say), url(r'sayhello$', views.sayhello), ]
urlpatterns 是固定写法,不能更改
推荐在子应用的路由结尾加反斜杠 /
路由命名及reverse反解析:
路由命名产生的原因:
项目的迭代,可能会导致路由信息需要多次修改,且修改的地方较多
随着子应用的数量越来越多,在不同子应用中路由使用了相同的名字会发生冲突
“解决办法”
1.在工程路由文件中,namespace参数定义空间
from django.conf.urls import url, include from django.contrib import admin # 路由 urlpatterns = [ url(r'^admin/', admin.site.urls), # include函数 url(r'^users/', include('users.urls', namespace='book')), ]
2.在子应用的路由文件中,name参数给路由起别名
urlpatterns = [ url(r'say$', views.say, name='say'), url(r'sayhello$', views.sayhello), ]
3.在视图函数中 使用 reverse函数 动态获取路由信息
from django.urls import reverse url = reverse('book:say')
reverse反解析:
1、“语法格式”:reverse(‘命名空间namespace:路由别名name’)
2、作用:根据“name”起的别名,动态的获取具体的路由信息
HttpRequest对象:
“利用HTTP协议向服务器传参的途径”
URL路径携带参数,例如https://item.jd.com/324432432.html
查询字符串传参,例如 ?keyword=平板电脑
请求体(body)发送数据传参,特征:表单,例如登录界面,注册界面,json,xml
在HTTP请求头中发送数据传参 不常见,按F12查看Request Headers
“第一种途径:URL路径携带参数”
它是根据位置传参的,需要一一对应的变量,否则会出现混乱的数据
缺点:位置限制
优化的思路:关键字传参,他的优点不需要考虑位置,语法格式—>(?P<变量名>\d+)
例子:
from django.conf.urls import url from users.views import lisi urlpatterns = [ # url(r'^index/(\d+)/(\d+)/$', lisi, name='lisi'), url(r'^(?P<category_id>\d+)/(?P<book_id>\d+)/$', lisi), ]
from django.shortcuts import render from django.http import HttpResponse from django.urls import reverse # Create your views here. # 定义一个视图函数 def lisi(request, book_id, category_id): return HttpResponse('这是第一次写视图函数') # url = reverse('book:lisi') # print(url) print(book_id, category_id) # 获取数据 username = '紫薇' # 组织数据 context = { 'username': username, } # request对象,模板路径,模板字典数据 return render(request,'index.html',context=context)