django入门
网址url的详解:url 统一资源定位符
ps:以百度为例:https://www.baidu.com/
第一部分:https代表协议
第二部分:www.baidu.com代表域名,也就是百度web服务的ip和端口
第三部分:路径,看起来貌似什么都没有,其实它是‘/’代表根路径
完善框架雏形代码:(这只是模拟实现浏览网页)
def handler_client(client_socket): # 就是客户端(浏览器给我们发送的请求) request = client_socket.recv(1024) print(request) # 伪代码: if 路径 == '/': function1() if 路径 == '/news/': function2() if 路径 == '/girls/': function3() def function1(): client_socket.send(b'HTTP/1.1 200 OK \r\n\r\n') client_socket.send(b'返回首页!') def function2(): client_socket.send(b'HTTP/1.1 200 OK \r\n\r\n') client_socket.send(b'新闻') def function3(): client_socket.send(b'HTTP/1.1 200 OK \r\n\r\n') client_socket.send(b'美女')
这样的话,在我们修改完成后,我们的雏形代码就 会有判断路径,并且根据路径不同调用不同的函数去返回不同的信息这个功能了
搭建开发环境
安装Virtualenv
升级pip命令:sudo pip3 install --upgrade pip
安装命令:sudo pip3 install virtualenv
cd myproject
创建名为venv为虚拟环境目录名,目录名自定义: virtualenv venv
你可以选择使用一个Python解释器:virtualenv -p /usr/bin/python3.6 python3 ( -p参数指定Python解释器程序路径)
激活虚拟环境:source venv/bin/activate
从现在起,任何你使用pip安装的包将会放在 venv 文件夹中,与全局安装的Python隔绝开。
停止虚拟环境:deactivate
删除虚拟环境: rm -rf venv
安装virtualenvwrapper(确保virtualenv已安装) 它把你所有的虚拟环境都放在一个地方。
sudo pip3 install virtualenvwrapper
pip install virtualenvwrapper-win #Windows使用该命令
在~/.bashrc写入以下内容
export WORKON_HOME=~/Envs #virtualenvwrapper存放虚拟环境目录
source /usr/local/bin/virtualenvwrapper.sh #virtrualenvwrapper会安装到python的bin目录下,所以该路径是python安装bin/virtualenvwrapper.sh
source ~/.bashrc#读入配置文件,立即生效
virtualenvwrapper基本使用
创建虚拟环境: mkvirtualenv venv (venv 这个名字任意)
在任何目录执行下面命令:
mkvirtualenv --python=/usr/bin/python3.6 python3
查看当前的虚拟环境目录: workon [两次tab键]
切换到虚拟环境: workon python3
退出命令:deactivate
删除虚拟环境命令:rmvirtualenv python2
查看虚拟环境中已经安装的包: pip list
查看虚拟环境中已经安装的其它软件:pip freeze
安装django:以1.8.2版本为例,这是一个稳定性高、使用广、文档多的版本:
pip3 install django==1.8.2
安装mysql驱动包:
在 python3 中,改变了连接库,改为了 pymysql 库,使用pip install pymysql 进行安装,直接导入即可使用
但是在 Django 中, 连接数据库时使用的是 MySQLdb 库,这在与 python3 的合作中就会报以下错误了
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named 'MySQLdb'
解决方式1:
在 __init__.py 文件中添加以下代码即可。
import pymysql
pymysql.install_as_MySQLdb() 顾名思义:让 Django 把 pymysql 当成 MySQLdb 来使用吧,但是这样的解决方式并不是一蹴而就,以后每个新项目当中我们都要去写上这两行代码,比较繁琐,不推荐
解决方式2:
安装另外一款可以替代MySQLdb的包,mysqlclient,但是这个包在windows下是完美支持的,如果要在linux下使用,需要先安装依赖包,在终端经过以下两个命令后,数据库完美解决问题,推荐使用。
sudo apt-get install python3-dev libmysqlclient-dev
pip install mysqlclient
创建项目和应用:
1. 常用命令
创建test1项目命令:django-admin startproject test1
创建booktest应用命令:python3 manage.py startapp booktest
运行服务器命令:python3 manage.py runserver 8080
生成迁移文件命令:python3 manage.py makemigrations
执行sql语句生成数据表命令:python3 manage.py migrate
创建一个管理员用户命令:python3 manage.py createsuperuser#按提示输入用户名、邮箱(可忽略不写)、密码
2. 创建项目和应用:
1)、打开终端窗口
2)、进入到创建好的虚拟环境中 workon 虚拟环境名(python3)
3) 、找到提前创建好的项目管理文件夹 并且进入到这个文件夹中(例如,在~/Desktop下创建一个django项目管理文件夹)
4) 、在这个文件夹当中使用命令去创建我们的项目:
django-admin startproject testdjango
创建好项目之后,查看,会看到我们的testdjango项目目录
5) 、项目创建成功后进入到项目目录当中,创建项目的第一个应用
python manage.py startapp test1
3、项目目录文件详解:
manage.py:一个命令行工具,可以使你用多种方式对Django项目进行交互。
内层的目录(test1):项目的真正的Python包。
_init _.py:一个空文件,它告诉Python这个目录应该被看做一个Python包。
settings.py:项目的配置
urls.py:项目的URL声明,用来做url路由匹配
wsgi.py:项目与WSGI兼容的Web服务器入口.
4、应用文件作用:
admin.py:这个文件用于在admin后台注册模型类
models.py:书写对应的数据库模型类
views.py:用于书写我们的控制逻辑
_init _.py:可以对应用进行初始化,可以让应用的目录作为包来使用
tests.py:用来做测试使用
migrations :用来存放数据模型迁移文件
5、 django一次会话的实现(案例)
django处理会话三大步:
1、配路由 :每个请求都会对应特定的路由,路由是在urls文件当中去配置
2、写视图:每个路由都会对应特定的处理函数(类),其实就是我们的view视图
3、返数据每个处理函数(类)都会返回特定的响应信息(字符串,html内容,json)
6、django是用来做网站的,网站的基本组成是网页,而网页上又包含了一个或者多个会话,因此我们可以大胆断言,django就是用来处理这一个一个会话的(我们也可以这样理解:网页上包含了一个或者多个请求)。
实现第一个会话的流程代码:
1)、打开终端,进入到我们的虚拟环境python3
2)、在我们预先准备好的项目管理文件夹django下创建新的项目testdjango
3)、进入到我们的项目文件夹下创建我们第一个应用test1
4)、使用pycharm打开我们的项目
5)、在pycharm中将虚拟环境设置为我们的python3虚拟环境
6)、对项目进行基本设置settings
将我们第一个app添加到INSTALLED_APPS 中
7)、配置路由 :在项目设置目录下,也就是和项目同名的那个目录下有个urls文件,这个就是我们的路由配置文件,在文件中会有这样的代码
urlpatterns就是我们的路由,我们可以在这个路由当中去配置我们的第一个路由,其实就是一个url方法,这个方法有四个参数
正则 浏览器网址输入网址发送请求后,会通过这个正则去匹配url中的路径
view函数 如果正则匹配网址的路径成功就会把请求传给相对应的这个函数处理
可选参数 一般不用
name 代表反向解析(软连接)名字
8)、书写view视图处理函数
9)、urls导入书写的视图:
最后,我们在urls当中导入我们刚写好的view视图index如下所示:
10)、运行我们的服务测试:
运行服务两种方式,1、可以在终端中进入我们的项目,在项目文件夹下使用命令运行服务:python manage.py runserver
项目默认会在本机8000端口运行
2、我们也可以在pycharm当中,点击工具栏当中的Run,运行我们的项目
按住ctrl点击http://127.0.0.1:8000,我们可以在浏览器上查看效果
上面,我们通过一次会话,给浏览器返回了一句话,也就是一个字符串,假设,我们还想去返回一个html网页内容怎么去做呢?
1)、如果要返回去带有动态数据的网页内容,我们需要用到模板,首先需要在项目目录下创建一个文件夹templates,这个名字不能变,用来存储我们的html页面,html页面就是我们所说的模板。而templates,就是我们的模板文件夹。
2)、在settings文件当中,设置模板路径,settings当中有一项专门设置模板路径的地方,如果我们是通过终端命令创建的项目,那么这一项是需要我们手动配置,如果我们是用pycharm创建的项目,可以设置自动创建templates文件夹和配置模板路径。
3)、配置好上面两项之后,我们就可以在templates文件夹下创建我们的html页面,并且通过我们的view视图函数返回这个页面。
要去返回这个页面,我们仅仅需要把view视图函数当中返回的HttpResponse对象,变成render对象即可:
from django.shortcuts import render,HttpResponse # Create your views here. def page_html(request): return render(request,'test.html')
路由传参:
未命名正则表达式组传参(位置传参):
view视图
命名正则表达式组传参(关键字传参):
from django.conf.urls import include, url from .views import show_news_index,show_news_detail urlpatterns = [ url(r'^news_index/$',show_news_index,name='show_news_index'), #未命名正则表达式组传参(位置传参) # url(r'^news_index/(\d+)/(\d+)/(\d+)/$', show_news_detail, name='show_news_detail'), #命名正则表达式组传参(关键字传参) url(r'^news_index/(?P<year>\d+)/(?P<month>\d+)/(?P<day>\d+)/$', show_news_detail, name='show_news_detail'), ]
view视图
from django.shortcuts import render,HttpResponse # Create your views here. def show_news_index(request): return render(request,'news_index.html') def show_news_detail(request,day,month,year): print(request.path) print(request.method) if request.method == 'GET': return HttpResponse(year+'年'+month+'月'+day+'日') else: return HttpResponse('post')
html页面:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <p>我是新闻的首页</p> <a href="{% url 'news:news_date' 2018 4 21%}">2018.4.21的新闻</a> </body> </html>
请求方式传参:
view视图
def show_girls(request): a = ['yangmi','zhaoliying','yangying'] return render(request,'girls_index.html',{ 'a':a })
html页面:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <p>我是美女首页</p> {% for meimei in a %} {{ meimei }} {% endfor %} </body> </html>
urls:
from django.conf.urls import include, url from .views import girls_detail urlpatterns = [ url(r'^girls_detail/$', girls_detail, name='girls_detail'), ]
views:
from django.shortcuts import render,HttpResponse # Create your views here. def girls_detail(request): name = request.GET.get('name',None) return HttpResponse(name)
html(templates):
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <p>我是美女的首页</p> <a href="{% url 'girls:girls_detail' %}?name=赵丽颖">赵丽颖</a>br <br> <a href="{% url 'girls:test_post' %}">测试post传参</a> </body> </html>