Home >  > 网站开发(六)财务网开发一

网站开发(六)财务网开发一

0

既然用现有的源码无法搭建,那就自己写吧。
一、环境搭配
这个不多说了,和以前一样。按这里操作,一直到可以显示django首页就可以了。

用pycharm打开项目,然后配置虚拟环境:

File -- Setting -- Project Interpreter -- Show all -- add

其实配置好之后,这里可以显示已经安装的包

二、django-allauth同时实现本地和第三方认证
1.安装django-allauth
pip install django-allauth

2.修改配置文件setting.py

AUTHENTICATION_BACKENDS = (
    # Django 后台可独立于 allauth 登录
    'django.contrib.auth.backends.ModelBackend',

    # 配置 allauth 独有的认证方法,如 email 登录
    'allauth.account.auth_backends.AuthenticationBackend',
)


INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.sites',
    'zanhuapp',
    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    
    # 可添加需要的第三方登录
    'allauth.socialaccount.providers.github',
    'allauth.socialaccount.providers.weibo',
]

# 设置站点
SITE_ID = 1

# 登录成功后重定向地址
LOGIN_REDIRECT_URL = '/article/article-list'

注意,站点设置和django.contrib.sites也必须加上,不然会报错。

File "H:\web\caiwu\caiwu\lib\site-packages\django\db\models\base.py", line 95,
in __new__
"INSTALLED_APPS." % (module, name)
RuntimeError: Model class django.contrib.sites.models.Site doesn't declare an ex
plicit app_label and isn't in an application in INSTALLED_APPS.

3.修改url.py
修改根目录的url.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('accounts/', include('allauth.urls')),
]

4.迁移数据
python manage.py migrate

5.测试效果
输入http://127.0.0.1:8000/accounts/login/,就可以看到登陆页面了。

参考资料:
https://www.jianshu.com/p/8989be98fd6d

6.美化模板
模板文件是保存在虚拟环境下的,路径是:env\Lib\site-packages\allauth\templates\account\login.html,如果你直接修改,部署到服务器上面的时候又没有了。所以最好在项目中创建一个完全相同的路径。

所以只需要在\zhanhu\zanhu-master\zanhu\templates\account下面建立login.html文件,Django会优先在项目中寻找模板文件,所以只需要在上面的目录中建立了这个文件夹,访问http://127.0.0.1:8000/accounts/login/的时候就是你新建的页面了。

三、设定数据库
1.修改models.py
需要先安装下面几个库,安装完之后记得在settings.py的INSTALLED_APPS里面添加这几个库。
pip install django-markdownx
pip install django-taggit
python-slugify==3.0.1

2.修改数据库为MySql
由于之前用的是SQLite,不过后来我还是决定用MySql,所以又将数据库重新做了设定。数据库的设定可以看
这里

再做好数据库迁移,就可以进入后台查看了:

3.后台添加问题、答案的管理功能

from .models import Vote, Question, Answer

# Register your models here.
admin.site.register(Vote)
admin.site.register(Question)
admin.site.register(Answer)

刷新一下,就可以看到了:

4.修正Markdown的功能
上面虽然在后台显示了添加问题、答案的功能,可是点击“add”,却发现有出错信息:

The current path, markdownx/markdownify/, didn't match any of these.

在项目下(非app下)的url.py中,添加以下代码:

urlpatterns = [
    path('markdownx/', include('markdownx.urls')),
]

这时再看,添加问题的功能就正常了。

四、设定网站首页
由于我们没有设定好网站的页面,上面django-allauth登陆页面登陆后无法正常跳转,所以下面来设定。
1.设定url
在项目下(非app下)的url.py中,添加以下代码:

urlpatterns = [
    path('', include('zanhuapp.urls')),
]

2.在app文件夹下面(zanhuapp)建立一个urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('',views.index),
]

3.修改app文件夹下面的views.py

from django.shortcuts import render

def index(request):
    return render(request,'zanhuapp/index.html')

4.模板文件
在zanhu\zanhuapp\templates\zanhuapp下面建立index.html文件。
并在app项目下建立statics文件夹,存放静态文件。

5.修改settings.py文件
这个还一步要加,虽说Django 默认会在 STATICFILES_DIRS中的文件夹 和 各app下的static文件夹中找文件。

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
)

6.修改index.html文件的静态文件的地址

{% load staticfiles %}
<link rel="stylesheet" type="text/css" href="{%static 'css/bootstrap.css'%}" />
<link rel="stylesheet" type="text/css" href="{%static 'css/common.css'%}" />
<link rel="stylesheet" type="text/css" href="{%static 'css/style.css'%}" />
<link rel="stylesheet" type="text/css" href="{%static 'css/wangeditor.css'%}" />

5.测试效果

五、设定django-allauth的跳转
1.设定一个hello的跳转网址,并在views中设定它为转向hello.html
urlpatterns = [
path('hello/',views.hello),
]

2.在settings.py中设定跳转网址

LOGIN_REDIRECT_URL = '/hello/'

3.测试
这时注册成功后就可以正常跳转了。

而且可以登陆,可以登出。

六、显示答案
直接使用下面的代码就可以了:

                {% for answer in question.answer_set.all %}
                     {% include 'zanhuapp/answer_sample.html' with answer=answer %}
                {% empty %}
                  <div class="text-center">
                      <h4>目前没有回答</h4>
                  </div>
                {% endfor %}

这样,问答下面有几个答案,answer_sample.html就会重复几次。所以,在answer_sample.html里面加入以下代码就可以显示数据了:

{{ answer.total_votes }}           #显示投票数
{{ answer.created_at|timesince }}  #显示回答时间,格式为xx天前
{{ answer.get_markdown|safe }}  #显示问题答案的内容

七、扩展用户模型
django-allauth 并没有提供展示和修改用户资料的功能,也没有对用户资料进行扩展,所以我们需要自定义用户模型来进行扩展。
1.创建 app 及配置
由于 django-allauth 已经占用了 account 这个 app,所以我们需要创建一个名叫 users 的 app,并将其加入 settings.py 配置文件的 INSTALL_APPS 中。

python manage.py startapp users

2.配置URL
同时把url也加入到项目的 ROOT URLs 中。

# urls.py
 
from django.conf.urls import url, include
 
urlpatterns = [
    ...,
    url(r'^accounts/', include('allauth.urls')),
    url(r'^accounts/', include('users.urls')),
]

3.设置跳转url
因为我们希望用户在登录或注册成功后,自动跳转到 "/accounts/profile/",我们可以加入(修改)如下代码

# settings.py
 
LOGIN_REDIRECT_URL = "/accounts/profile/"

4.创建用户模型及表单

from __future__ import unicode_literals

from django.utils.encoding import python_2_unicode_compatible
from django.contrib.auth.models import AbstractUser
from django.db import models
from django.urls import reverse


@python_2_unicode_compatible
class User(AbstractUser):
    """自定义用户模型"""
    nickname = models.CharField(null=True, blank=True, max_length=255, verbose_name='昵称')
    job_title = models.CharField(max_length=50, null=True, blank=True, verbose_name='职称')
    introduction = models.TextField(blank=True, null=True, verbose_name='简介')
    picture = models.ImageField(upload_to='profile_pics/', null=True, blank=True, verbose_name='头像')
    location = models.CharField(max_length=50, null=True, blank=True, verbose_name='城市')
    personal_url = models.URLField(max_length=555, blank=True, null=True, verbose_name='个人链接')
    weibo = models.URLField(max_length=255, blank=True, null=True, verbose_name='微博链接')
    zhihu = models.URLField(max_length=255, blank=True, null=True, verbose_name='知乎链接')
    github = models.URLField(max_length=255, blank=True, null=True, verbose_name='Github链接')
    linkedin = models.URLField(max_length=255, blank=True, null=True, verbose_name='LinkedIn链接')
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
    updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间')

    class Meta:
        verbose_name = '用户'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.username

    def get_absolute_url(self):
        return reverse('users:detail', kwargs={'username': self.username})

    def get_profile_name(self):
        if self.nickname:
            return self.nickname
        return self.username

表单

# users/forms.py
 
from django import forms
from .models import UserProfile
 
class ProfileForm(forms.ModelForm):
    '''从模型继承表单'''
    class Meta:
        model = User
        fields = ['nickname', 'job_title', 'introduction']

5.设定settings.py
创建自定义用户模型后, 需更改settings.py文件,指明使用的是自定义用户模型

AUTH_USER_MODEL = 'users.User'

6.设定views
我们需要创建2个URLs和对应的视图来实现用户资料展示和用户资料编辑页面。

from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from django.contrib import messages
 
from .models import User
from .forms import ProfileForm
 
 
@login_required
def profile(request):
    '''展示个人资料'''
    user = request.user
    return render(request, 'users/profile.html', {'user':user})



@login_required
def change_profile(request):
    '''更新个人资料'''
    if request.method == 'POST':
        # instance参数表示用model实例来初始化表单,这样就可以达到通过表单来更新数据 
        form = ProfileForm(request.POST, instance=request.user)
        if form.is_valid():
            form.save()
            # 添加一条信息,表单验证成功就重定向到个人信息页面
            messages.add_message(request, messages.SUCCESS, '个人信息更新成功!')
            return redirect('users:profile')
    else:
        # 不是POST请求就返回空表单
        form = ProfileForm(instance=request.user)
 
    return render(request, 'users/change_profile.html', context={'form': form})

7.url

# users/urls.py
 
from django.conf.urls import url
from . import views
 
app_name = 'users'
urlpatterns = [
    url(r'^profile/$', views.profile, name='profile'),
    url(r'^profile/change/$', views.change_profile, name='change_profile'),
]

8.模板
展示个人资料的模板:

# users/templates/users/profile.html
 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>个人资料</title>
</head>
<body>
 
<!--消息块-->
{% if messages %}
<div class="container">
    {% for message in messages %}
    <div class="alert {% if message.tags %}alert-{{ message.tags }}{% else %}alert-secondary{% endif %} alert-dismissible rounded-0 fade show" role="alert">
        {{ message }}
        <button type="button" class="close" data-dismiss="alert" aria-label="Close">
            <span aria-hidden="true">&times;</span>
        </button>
    </div>
    {% endfor %}
</div>
{% endif %}
 
{% if user.is_authenticated %}
<a href="{% url 'users:change_profile' %}">修改资料</a>
<a href="{% url 'account_logout' %}">注销</a>
{% endif %}
 
<p>Welcome, {{ user.username }}</p>
 
<ul>
    <li>nick_name: {{ user.nick_name }}</li>
    <li>mobile: {{ user.mobile }}</li>
    <li>address: {{ user.address }}</li>
</ul>
 
</body>
</html>

更新个人资料的模板:

# users/templates/users/change_profile.html
 
{% load crispy_forms_tags %}
 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>修改资料</title>
    <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css"
          integrity="sha384-PsH8R72JQ3SOdhVi3uxftmaW6Vc51MKb0q5P2rRUpPvrszuE4W1povHYgTpBfshb" crossorigin="anonymous">
</head>
<body>
 
<!--消息块-->
{% if messages %}
<div class="container">
    {% for message in messages %}
    <div class="alert {% if message.tags %}alert-{{ message.tags }}{% else %}alert-secondary{% endif %} alert-dismissible rounded-0 fade show" role="alert">
        {{ message }}
        <button type="button" class="close" data-dismiss="alert" aria-label="Close">
            <span aria-hidden="true">&times;</span>
        </button>
    </div>
    {% endfor %}
</div>
{% endif %}
 
{% if user.is_authenticated %}
<a href="{% url 'users:change_profile' %}">修改资料</a>
<a href="{% url 'account_logout' %}">注销</a>
{% endif %}
 
<div class="container">
    <form method="post" enctype="multipart/form-data" action="{% url 'users:change_profile'%}">
        {% csrf_token %}
        {{ form|crispy }}
        <button class="btn btn-info btn-sm rounded-0" type="submit">更新资料</button>
    </form>
</div>
 
</body>
</html>

9.使用django-crispy-forms
由于修改个人资料需要处理表单, 我们可以安装 django-crispy-forms 插件来处理(美化)表单

# 安装 
pip install django-crispy-forms
 
# 加入 INSTALLED_APPS
INSTALLED_APPS = [
    ...,
    'allauth.socialaccount.providers.weibo',
    'allauth.socialaccount.providers.github',
 
    'crispy_forms',  # bootstrap 表单样式
]
 
# 配置表单插件使用的样式
CRISPY_TEMPLATE_PACK = 'bootstrap4'

预览效果:

这个crispy_forms真的十分好用,更改成功的提示。

如果要在修改资料那里添加更多的字段,只需要在froms.py里面添加,然后修改profile.html即可。

10.执行migrate
报错:

System check identified some issues:

WARNINGS:
?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default'
HINT: MySQL's Strict Mode fixes many data integrity problems in MySQL, s
uch as data truncation upon insertion, by escalating warnings into errors. It is
strongly recommended you activate it. See: https://docs.djangoproject.com/en/2.
1/ref/databases/#mysql-sql-mode
Traceback (most recent call last):
File "manage.py", line 15, in
execute_from_command_line(sys.argv)
File "H:\web\caiwu\caiwu\lib\site-packages\django\core\management\__init__.py"
, line 381, in execute_from_command_line
utility.execute()
File "H:\web\caiwu\caiwu\lib\site-packages\django\core\management\__init__.py"
, line 375, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "H:\web\caiwu\caiwu\lib\site-packages\django\core\management\base.py", li
ne 316, in run_from_argv
self.execute(*args, **cmd_options)
File "H:\web\caiwu\caiwu\lib\site-packages\django\core\management\base.py", li
ne 353, in execute
output = self.handle(*args, **options)
File "H:\web\caiwu\caiwu\lib\site-packages\django\core\management\base.py", li
ne 83, in wrapped
res = handle_func(*args, **kwargs)
File "H:\web\caiwu\caiwu\lib\site-packages\django\core\management\commands\mig
rate.py", line 85, in handle
executor.loader.check_consistent_history(connection)
File "H:\web\caiwu\caiwu\lib\site-packages\django\db\migrations\loader.py", li
ne 297, in check_consistent_history
connection.alias,
django.db.migrations.exceptions.InconsistentMigrationHistory: Migration socialac
count.0001_initial is applied before its dependency users.0001_initial on databa
se 'default'.

按网上的方法:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django_test',
        'USER':'root',
        'PASSWORD':'',
        'HOST':'localhost',
        'PORT':'3306',
        #下面是新加入的
        'OPTIONS':{
            'init_command':"SET sql_mode='STRICT_TRANS_TABLES'",
            'charset':'utf8mb4',
        },
    }
}

前面的mysql.W002错误没有了,但是还是提示:
django.db.migrations.exceptions.InconsistentMigrationHistory: Migration account.
0001_initial is applied before its dependency users.0001_initial on database 'de
fault'.

于是按网上的方法,删除数据库中 除了auth_user的其他表,然后重新来一次python manage.py migrate,终于好了,可以运行python manage.py runserver了。

10、显示账户信息
代码如下:

<ul>
    <li>nick_name: {{ user.nickname }}</li>
    <li>mobile: {{ user.job_title }}</li>
    <li>address: {{ user.introduction }}</li>
</ul>

八、修改页头
让页头登陆与未登陆显示不同的内容

              <ul>
                {% if user.is_authenticated %}
                <li>
                  <a class="" href="{% url 'users:change_profile' %}" rel="nofollow">修改资料</a></li>  
                <li>
                  <a class="" href="{% url 'account_logout' %}" rel="nofollow">注销</a></li>
                {% else %}
                <li>
                  <a class="" href="/accounts/login/" rel="nofollow">登录</a></li>
                <li>
                  <a class="" href="/accounts/signup/" rel="nofollow">注册</a></li>
                {% endif %}
              </ul>

九、忘记密码了怎么办
忘记了后台管理员的密码,只需要执行以下命令,这样就把原来的密码改了,就可以使用新的密码登陆了。

新建一个超级管理员
python manage.py createsuperuser
输入username
输入password,再次确认密码password
两次密码输入相同时,管理员创建成功

参考:
https://blog.csdn.net/bbwangj/article/details/89093616

备注:
下面为布置github上面的代码的尝试:

一、代码部署
1.rcssmin出错
我用virtualenv建立虚拟环境,然后用pip install -r local.txt安装,rcssmin这个库无法安装报错。
然后改用pipenv安装,还是报这个错误。
在网上查询了一下,好像是因为我电脑中安装了anaconda的问题,后来使用这里的方法,合适下面的语句安装:

pip install rcssmin --install-option="--without-c-extensions"

再安装local.txt终于没有报错了。

2.环境变量
然后执行python manage.py runserver,出现下面的错误:

UserWarning: Error reading C:\Users\Kevin\wendawang\zanhu\.env - if you're not con
figuring your environment separately, check this.
"environment separately, check this." % env_file)
Traceback (most recent call last):
File "manage.py", line 30, in
execute_from_command_line(sys.argv)

解决:
twisted
解决了channels
ModuleNotFoundError: No module named 'win32api'
pip install pypiwin32
ModuleNotFoundError: No module named 'sorl'
pip install sorl-thumbnail
ModuleNotFoundError: No module named 'django_comments'
pip install django-contrib-comments
ModuleNotFoundError: No module named 'markdownx'
pip install django-markdownx
No module named 'taggit'
pip install django-taggit
django-haystack==2.8.1
elasticsearch==2.4.1

修改数据库连接
数据库migrate
报错:
File "C:\Users\Kevin\wendawang\zanhu_venv\lib\site-packages\django\template\ba
se.py", line 534, in invalid_block_tag
"or load this tag?" % (token.lineno, command)
Invalid block tag on line 29: 'cache'. Did you forget to register or load this
tag?

首页:
500 Internal Server Error

Exception inside application.
Daphne

在base.html中添中了{% load cache %}这段代码,终于看到了首页了。

python3 manage.py collectstati

还是不行:

二十、采集
初步代码:

import requests

payload = {"currentPage":"4",
		"nr":""	,
		"jg":""	,
		"zxjg":"",	
		"lykssj":""}

r = requests.post('https://xxx/nszx/onlinemessage/messagelist',data = payload)

jsons = r.json()
questions = jsons["pageSet"]
f = open("urls.txt")
lines = f.read()

for i in questions:
	if str(i["id"]) not in lines:
		open("urls.txt","a+").write(i["id"]+'\n')
		#这里发布文章
		# print(i["id"])
		# print(i["title"])
		# print(i["content"])
		print("post updated")		
	else:
		print("No post updated")

取数

import requests

payload = {"currentPage":"4",
		"nr":""	,
		"jg":""	,
		"zxjg":"",	
		"lykssj":""}

r = requests.post('https://123.ch.g.cn/nszx/onlinemessage/messagelist',data = payload)

jsons = r.json()
questions = jsons["pageSet"]
for i in range(1,8):
	print(questions[i]['title'])
	print(questions[i]['content'])
	print("*"*100)

可以参考:https://bbs.xiuno.com/
https://github.com/lgphone/FakeV2EX

本文暂无标签

发表评论

*

*